2012-01-27 144 views
2

我正在使用OpenGL ES 2.0用於嵌入式設備的應用程序的工作。OpenGL ES 2.0的質感黑色

這是我的片段着色器:

varying vec2 v_texCoord; 
uniform sampler2D s_texture; 
void main() { 
    gl_FragColor = texture2D(s_texture, v_texCoord); 
} 

我正確設置的紋理。出於某種原因,致電glTexImage2D不會產生我正在尋找的結果。紋理完全是黑色的,而不是填充我提供的數據。

這是我如何創建紋理:

GLuint textureId; 

    // 2x2 Image, 3 bytes per pixel (R, G, B) 
    GLubyte pixels[6 * 3] = 
    { 
     255, 0, 0, // Red 
     0, 255, 0, // Green 
     0, 0, 255, // Blue 
     255, 255, 0, // Yellow 
     0, 255, 255, 
     255, 0, 255 
    }; 

    // Use tightly packed data 
    glPixelStorei (GL_UNPACK_ALIGNMENT, 1); 

    // Generate a texture object 
    glGenTextures (1, &textureId); 

    // Bind the texture object 
    glBindTexture (GL_TEXTURE_2D, textureId); 

    // Load the texture 
    glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, 3, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels); 


    // Set the filtering mode 
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

後來,我把紋理就像這樣:

samplerLoc = glGetUniformLocation (userData->programObject, "s_texture"); 
glActiveTexture (GL_TEXTURE0); 
glBindTexture (GL_TEXTURE_2D, textureId); 

// Set the sampler texture unit to 0 
glUniform1i (samplerLoc, 0); 

我證實了頂點和紋理座標綁定,並傳遞給着色器調試時。所以,它必須是s_textureglTexImage2D函數本身的問題。

+0

您是否使用'GetError'檢查錯誤?你也可能以錯誤的順序調用'TexImage'和'TexParameter'('TexParameter'通常出現在'TexImage'之前),儘管我不確定這是否會影響任何東西。這就是說,'TexImage'不太可能成爲問題,而且幾乎肯定是你的錯誤。 – nil 2012-01-27 22:15:52

+0

是的,我做到了。沒有記錄錯誤。我知道它不能是頂點着色器,因爲當我調試時,我看到頂點座標和紋理座標正確傳遞。它幾乎是一本來自教科書的直截了當的例子。我不知道我錯過了什麼。 :( – Nick 2012-01-27 22:16:31

+0

也可能是因爲你的紋理要麼不是方形的,要麼是它的尺寸不是2的冪。 – nil 2012-01-27 22:19:30

回答

6

你需要鉗位模式設置爲CLAMP_TO_EDGE兩個U和V的尺寸,否則質感是不完整的,並且將樣品爲黑色。

+0

OMG !!!它的工作謝謝!! 但我不能似乎解釋了爲什麼我需要設置夾具,因爲我所有的紋理座標都在這個範圍內。 但是,無論如何感謝!! – Nick 2012-01-28 22:08:26

+0

兩個紋理的非功率需要clamp_to_edge的工作(其中包括),這就是爲什麼 http:// stackoverflow.com/questions/11069441/non-power-of-two-textures-in-ios – OMH 2014-03-12 09:23:17

2

也許我缺少明顯的東西,但如果你僅存儲2×2與每色3個字節(= 4×3個字節= 12個字節)作爲紋理像素;那麼「GLubyte像素[6 * 3]」中的6來自哪裏?

6 * 3等於18和= 2

功率//加載紋理glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,3,2,0, GL_RGB,GL_UNSIGNED_BYTE,像素)!;

從規格: glTexImage2D(GLenum目標,閃爍的水平,閃光internalFormat,GLsizei寬度,高度GLsizei,閃爍邊界,GLenum格式,GLenum類型,常量GLvoid *數據);

粗體瓦爾,最好在一個^ 2 ...

所以,試試這個:

//載入紋理glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,2,2,0, GL_RGB,GL_UNSIGNED_BYTE,pixels);

從像素數組中刪除最後2行,然後將所有值更改爲「255」;如果你得到一個白色的紋理,這意味着它的工作。

又如:

GLubyte像素[4 * 3] = {

255,0,0,// //紅綠藍// //像素0

255 ,0,0,// //紅綠藍// //像素1

255,0,0,// //紅綠藍// //像素2

255,0,0 //紅色//綠色//藍色//像素3

};

而且一切都顯示爲紅色。

如果沒有做,也許我的代碼將有助於:

void CMesh::renderMesh(GLuint program, glm::mat4 *mvp){ 

glUseProgram(program); 

int mvpLocation = glGetUniformLocation(program, "matViewProjection"); 
int texLocation = glGetUniformLocation(program, "baseMap"); 
glUniformMatrix4fv(mvpLocation, 1, GL_FALSE, glm::value_ptr(*mvp)); 

int vertexAttribLocation = glGetAttribLocation(program, "vertex"); 
int uvAttribLocation = glGetAttribLocation(program, "texturecoordinate"); 

// Bind our texture in Texture Unit 0 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, textureIndex); 
glUniform1i(texLocation, 0); 

glEnableVertexAttribArray(0); 
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
glVertexAttribPointer(
    vertexAttribLocation,    
    3,        // size 
    GL_FLOAT,      // type 
    GL_FALSE,      // normalized? 
    0,        // stride 
    (void*)0       // array buffer offset 
); 

glEnableVertexAttribArray(1); 
glBindBuffer(GL_ARRAY_BUFFER, uvBuffer); 
glVertexAttribPointer(
    uvAttribLocation,     
    2,     // size 
    GL_FLOAT,   // type 
    GL_FALSE,   // normalized? 
    0,     // stride 
    (void*)0   // array buffer offset 
); 

// Draw the triangles ! 
glDrawArrays(GL_TRIANGLES, 0, vertices.size()); 

glDisableVertexAttribArray(0); 
glDisableVertexAttribArray(1); 
}; 
+0

我假設他的2x2是一個拼寫錯誤 – nil 2012-01-27 23:11:26

+0

如果你看他的數據,那麼就不是這樣了 – Erik 2012-01-27 23:21:12

+0

2 X 2是一個錯字 – Nick 2012-01-27 23:28:57