【问题标题】:OpenGL ES 2.0 cubemap is not showing a textureOpenGL ES 2.0 立方体贴图未显示纹理
【发布时间】:2015-06-17 07:24:07
【问题描述】:

我想实现一个天空盒,但不知何故没有渲染。 在初始化中,我只是将立方体的 3 个位置坐标从 (-1,-1,-1) 加载到 (1, 1, 1)。纹理也在加载,可能并将它们添加到立方体贴图中。 通过渲染,我只传递了 ModelViewProj,但没有平移、缩放或任何应用于它的东西,只有投影。

有人知道为什么它不起作用吗?我是不是忘记了什么或者理解错了什么?

初始化 VBO:

_VertexData = skyboxVertices;
_ByteSize = sizeof(GLfloat) * 3;
_NumTriangles = 36;

glEnable(GL_DEPTH_TEST);

glGenVertexArraysOES(1, &_vertexArray);
glBindVertexArrayOES(_vertexArray);

glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(skyboxVertices), skyboxVertices, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 32, BUFFER_OFFSET(0));
glBindVertexArrayOES(0);

[self loadTextureFromImage:path Type:typ];

加载纹理:

glGenTextures(1, &(_TextureID));
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_CUBE_MAP, _TextureID);

for (int face = 0; face < 6; ++face) {
    [self getImage:[NSString stringWithFormat:@"%i",face]];
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, imageData);
}

glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)width, (int)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);

glBindTexture(GL_TEXTURE_CUBE_MAP, 0);


free(imageData);

绘制天空图:

glDepthMask(GL_FALSE);
glBindVertexArrayOES(_vertexArray);

glUseProgram(prog);

glEnable(GL_TEXTURE_CUBE_MAP);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_CUBE_MAP, _TextureID);


GLuint projMatrix = glGetUniformLocation(prog, "modelViewProjectionMatrix");
GLuint normalMatrix = glGetUniformLocation(prog, "normalMatrix");
GLuint samplerCube =glGetUniformLocation(prog, "cubeMap");

glUniformMatrix4fv(projMatrix, 1, 0, _modelViewProj.m);
glUniform1i(samplerCube, 0);

glDrawArrays(GL_TRIANGLES, 0, _NumTriangles);
glDepthMask(GL_TRUE);

顶点着色器:

attribute vec4 position;
attribute vec3 texCoord;
attribute vec3 normal;

varying lowp vec3 vTexCoord;

uniform mat4 modelViewMatrix;
uniform mat4 modelViewProjectionMatrix;
uniform mat3 normalMatrix;

void main()
{
    vTexCoord = texCoord;
    gl_Position = modelViewProjectionMatrix * position;
}

片段着色器:

uniform samplerCube cubeMap;

varying lowp vec3 vTexCoord;

void main()
{
    lowp vec4 texCol = textureCube(cubeMap, vTexCoord);

    lowp vec4 color = vec4(1.0,0.0,0.0,1.0);

    gl_FragColor = vec4(texCol.rgba);
}

这是洞口信息

GLfloat skyboxVertices[108] = {
    // Positions
    -1.0f,  1.0f, -1.0f,
    -1.0f, -1.0f, -1.0f,
    1.0f, -1.0f, -1.0f,
    1.0f, -1.0f, -1.0f,
    1.0f,  1.0f, -1.0f,
    -1.0f,  1.0f, -1.0f,

    -1.0f, -1.0f,  1.0f,
    -1.0f, -1.0f, -1.0f,
    -1.0f,  1.0f, -1.0f,
    -1.0f,  1.0f, -1.0f,
    -1.0f,  1.0f,  1.0f,
    -1.0f, -1.0f,  1.0f,

    1.0f, -1.0f, -1.0f,
    1.0f, -1.0f,  1.0f,
    1.0f,  1.0f,  1.0f,
    1.0f,  1.0f,  1.0f,
    1.0f,  1.0f, -1.0f,
    1.0f, -1.0f, -1.0f,

    -1.0f, -1.0f,  1.0f,
    -1.0f,  1.0f,  1.0f,
    1.0f,  1.0f,  1.0f,
    1.0f,  1.0f,  1.0f,
    1.0f, -1.0f,  1.0f,
    -1.0f, -1.0f,  1.0f,

    -1.0f,  1.0f, -1.0f,
    1.0f,  1.0f, -1.0f,
    1.0f,  1.0f,  1.0f,
    1.0f,  1.0f,  1.0f,
    -1.0f,  1.0f,  1.0f,
    -1.0f,  1.0f, -1.0f,

    -1.0f, -1.0f, -1.0f,
    -1.0f, -1.0f,  1.0f,
    1.0f, -1.0f, -1.0f,
    1.0f, -1.0f, -1.0f,
    -1.0f, -1.0f,  1.0f,
    1.0f, -1.0f,  1.0f
};

【问题讨论】:

  • 你的纹理尺寸是多少?
  • 1024x1024 是每个纹理的大小
  • 您似乎没有为纹理坐标设置顶点属性。

标签: ios objective-c dictionary opengl-es


【解决方案1】:

您的立方体贴图生成代码有错误:

for (int face = 1; face <= 6; ++face) {

你应该从 0 到 5 运行这个,否则你不会为 GL_TEXTURE_CUBE_MAP_POSITIVE_X 上传任何东西,你会为 GL_TEXTURE_CUBE_MAP_POSITIVE_X+6 上传一些东西,这是无效的。

你应该显示你的着色器,因为那里也可能有错误。

编辑

缓冲区创建似乎不正确。由于你有一个位置、texCoord 和一个普通属性,你应该有 3 个顶点属性指针,每个指针一个:

glEnableVertexAttribArray(0); //position
glEnableVertexAttribArray(1); //texcoord
glEnableVertexAttribArray(2); //normal

glVertexAttribPointer(0, 4, GL_FLOAT, false, vertexByteSize, 0); //position
glVertexAttribPointer(1, 3, GL_FLOAT, false, vertexByteSize, (void*)(4 * 4)); //texCoord
glVertexAttribPointer(2, 3, GL_FLOAT, false, vertexByteSize, (void*)(7 * 4)); //normal

注意我使用 0 1 2 作为属性位置,在你的实现中你应该使用 glGetAttribLocation();

此外,您的变量 _NumTriangles 应命名为 _NumVertices,因为它包含顶点数(一个立方体有 12 个三角形 --> 12*3 = 36 个顶点已上传)。

包含数据的缓冲区也可能有一些错误,您也可以复制吗?

【讨论】:

  • 好的,已编辑回答,您可以添加浮动缓冲区创建吗? (填充_VertexData的代码)
  • 我添加了它。 vertexData 只是这个 Array
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
相关资源
最近更新 更多