2015-06-17 87 views
1

我想實現一個天空盒,但不知何故沒有渲染。 在初始化過程中,我簡單地構建一個立方體的3個位置座標系,從(-1,-1,-1)加載到(1,1,1)。紋理也正在加載,可能會將其添加到立方體貼圖。 通過渲染我只傳遞ModelViewProj但沒有翻譯,縮放或任何應用到它,只有投影。OpenGL ES 2.0立方體貼圖不顯示紋理

有人看到它爲什麼不起作用嗎?我忘記了什麼或明白了什麼錯誤?

初始化VBO:

​​

加載紋理:

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)的寬度,(INT)高度,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 
}; 
+0

你的紋理的大小是多少? –

+0

1024x1024是每個紋理的大小 – DomiDiDongo

+0

它看起來像你沒有設置紋理座標的頂點屬性。 –

回答

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個頂點ATTRIB指針,每個:

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個頂點被上傳)。

也可能有一些包含數據的緩衝區的錯誤,你可以複製它嗎?

+0

好吧,我改變了它,並添加了我的着色器 – DomiDiDongo

+0

好了,編輯答案,你可以添加浮動緩衝區創建? (填充_VertexData的代碼) – agnu17

+0

我添加了它。 vertexData只是這個數組 – DomiDiDongo