如何用OpenGL ES 2.0创建天空盒?

你能给我暗示OpenGL ES 2.0中的任何好的天空盒的例子吗? 我发现只有OpenGL,并不适合我。 我这样做:初始化:

glUseProgram(m_programSkyBox.Program); glGenBuffers(1, &skyBoxVertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, skyBoxVertexBuffer); float vertices[24] = { -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, }; glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glGenBuffers(1, &skyBoxIndexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, skyBoxIndexBuffer); GLubyte indices[14] = {0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1}; glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 

绘制天空盒:

 glClearColor(0.5f, 0.5f, 0.5f, 1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(m_programSkyBox.Program); glDisable(GL_DEPTH_TEST); // skybox should be drawn behind anything else glBindTexture(GL_TEXTURE_CUBE_MAP, m_textures.Cubemap); glBindBuffer(GL_ARRAY_BUFFER, skyBoxVertexBuffer); glVertexAttribPointer(m_programSkyBox.Attributes.Position, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); glEnableVertexAttribArray(m_programSkyBox.Attributes.Position); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, skyBoxIndexBuffer); glDrawElements(GL_TRIANGLE_STRIP, 14, GL_UNSIGNED_BYTE, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glEnable(GL_DEPTH_TEST); 

纹理加载正在工作。 着色器编译正确,如下所示:顶点着色器:

 attribute vec4 position; varying mediump vec3 texCoord; void main() { texCoord.xyz = position.xyz; } 

片段着色器:

 uniform samplerCube Sampler; varying mediump vec3 texCoord; void main() { mediump vec3 cube = vec3(textureCube(Sampler, texCoord.xyz)); gl_FragColor = vec4(cube, 1.0); } 

但是我无法看到立方体。 我做错了什么?

你可以打算发送视图matrix(它定义了相机的位置),因为如果你不能环顾四周,为什么要有天空盒? 而且还可以世界matrix来增加一些规模。 我个人喜欢使用顶点位置作为纹理坐标,如果你知道你在做什么。 这应该是这样的:

 uniform mat4 projectionMatrix; uniform mat4 modelViewMatrix; attribute vec4 position; varying mediump vec4 texCoord; void main() { texCoord = position; gl_Position = modelViewMatrix * projectionMatrix * position; } 

gl_Position应该包含转换为2D屏幕空间的3D位置。 那就是modelViewProjection所做的。 texCoord应该是顶点上的纹理位置,通常不会随着顶点在屏幕上的位置而改变,所以不会与任何matrix相乘。 (也许有些情况下,将纹理坐标与投影matrix相乘有意义,但是天空盒肯定不是其中之一)。

我的错,我发现了这个问题。 我没有在顶点着色器中“创建”顶点。 它应该看起来这样:

 uniform mat4 projectionMatrix; attribute vec4 position; varying mediump vec4 texCoord; void main() { texCoord = projectionMatrix * position; gl_Position = texCoord; } 

我添加了一行:

 gl_Position = texCoord;