2013-04-30 39 views
2

我想從我手裏的顯卡,下面的教程在http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_06採樣是黑色

問題:當我嘗試紋理我的立方體,我的樣本是黑色的。

截圖:http://puu.sh/2JP1H.jpg(注:我設置藍= uv.x來測試我的UV)

我看着線程OpenGL textures appear just blackTexture is all black,但似乎他們有不同的問題。

首先,我用土壤圖像加載庫加載我的質地:

int w, h; 
unsigned char* img = SOIL_load_image("resources/images/4x4window.jpg",&w,&h,0,0); 
ErrorIf(!img, "%s", SOIL_last_result()); 
glGenTextures(1, &texture_id); 
glBindTexture(GL_TEXTURE, texture_id); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,w,h,0,GL_RGB,GL_UNSIGNED_BYTE,img); 

我的渲​​染功能,我通過我的紋理着色器程序:

void onDisplay() 
{ 
    glClearColor(1.0, 1.0, 1.0, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glUseProgram(program); 

    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, texture_id); 
    glUniform1i(uniform_myTexture, /*GL_TEXTURE*/0); 

    glEnableVertexAttribArray(attribute_coord3d); // open shader var 
    glBindBuffer(GL_ARRAY_BUFFER, vbo_cube_verts); // put stuff in buffer 
    glVertexAttribPointer(attribute_coord3d, 3, GL_FLOAT, GL_FALSE, 0, 0); //send 

    glEnableVertexAttribArray(attribute_texcoord); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo_cube_texcoords); 
    glVertexAttribPointer(attribute_texcoord, 2, GL_FLOAT, GL_FALSE, 0, 0); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_cube_elements); 
    int size; 
    glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size); 
    glDrawElements(GL_TRIANGLES, size/sizeof(GLushort), GL_UNSIGNED_SHORT, 0); 

    glDisableVertexAttribArray(attribute_coord3d); 
    glDisableVertexAttribArray(attribute_texcoord); 

    glutSwapBuffers(); 
} 

頂點着色器:

attribute vec3 coord3d; 
attribute vec2 texcoord; 
varying vec2 f_texcoord; 
uniform mat4 mvp; 

void main(void) 
{ 
    gl_Position = mvp * vec4(coord3d, 1.0); 
    f_texcoord = texcoord; 
} 

片段着色器:

varying vec2 f_texcoord; 
uniform sampler2D mytexture; 

void main(void) 
{ 
    vec4 result = texture2D(mytexture, f_texcoord); 

    result.z = f_texcoord.x; 
    result.w = 1; 

    gl_FragColor = result; 
} 
+0

哪裏是你的'#version'指令?或者你真的想'#version 110'? – genpfault 2013-04-30 02:10:01

回答

2

線,其中紋理必然是:

glBindTexture(GL_TEXTURE, texture_id); 

應該是:

glBindTexture(GL_TEXTURE_2D, texture_id); 
+0

謝謝,這工作!我應該用這個例子來說明。 後續問題:256x256紋理工作正常http://puu.sh/2JRBa.jpg,但2紋理的非功率是不可靠的http://puu.sh/2JRDH.jpg。 – gamedevnate 2013-04-30 02:56:45

+0

嗯...我的一個PNG工作正常(盒子),但另一個很奇怪:http://puu.sh/2JRRv.jpg – gamedevnate 2013-04-30 03:04:30

+0

哦,我也修好了! http://puu.sh/2JSw3.jpg 問題是我的盒子紋理沒有透明度,所以當我加載它時,格式只使用3個通道(R,G和B)。 我的其他紋理具有透明度,所以當我加載它時,格式使用4個通道(R,G,B和A)。 所以我現在只強迫4個頻道。 – gamedevnate 2013-04-30 03:27:53