当我尝试对纹理进行采样时 GLSL 着色器变黑

GLSL Shader going black when I try to sample a texture

我用这种方式渲染了一个三角形带,使用基本的旁路着色器一切正常: 编辑: 我添加了 TextCoords 并修改了着色器,我一直得到相同的结果,我的 3d 对象变黑了!

更新代码

// Dibuixem tots els prismes
    glBegin(GL_TRIANGLE_STRIP);
    for(i=0;i<num_elems;i++) {
        for(j=0;j<num_vertices;j++) {

            glNormal3fv((GLfloat *)(a+j*2));
            glTexCoord2f(0.0f, 0.0f); 
            glVertex3fv((GLfloat *)(a+j*2+1));
            glTexCoord2f(1.0f, 0.0f); 
            glNormal3fv((GLfloat *)(b+j*2));
            glTexCoord2f(1.0f, 1.0f); 
            glVertex3fv((GLfloat *)(b+j*2+1));
        }

        glNormal3fv((GLfloat *)(a));
        glTexCoord2f(0.0f, 1.0f);
        glVertex3fv((GLfloat *)(a+1));
        glNormal3fv((GLfloat *)(b));
        glTexCoord2f(0.0f, 0.0f); 
        glVertex3fv((GLfloat *)(b+1));
        a+=face_size;
        b+=face_size;
    }
    glEnd();

我正在尝试将纹理附加到我的着色器,但我不知道如何传递纹理。

我以这种方式创建纹理并将其添加到我的程序中。纹理数据已验证 格式为 unsigned char data[imageSize];:

的数组
   GLuint textureID;
   glGenTextures(1, &textureID);
   glBindTexture(GL_TEXTURE_2D, textureID);
   glActiveTexture(GL_TEXTURE0); // Texture unit 0
   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
   glTexImage2D(GL_TEXTURE_2D, 0,GL_BGR, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, data);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
   GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);

这是我在另一篇有相同问题的帖子中读到的,我在编译我的着色器并无误地生成我的程序后添加到我的代码中。 教程倾向于忽略此信息(您如何向着色器说明绑定纹理的名称和位置)。

GLuint t1Location = glGetUniformLocation(programID, "tex1");
glUniform1i(t1Location, 0);

还有我的着色器 更新代码:

#define GLSL(version, shader) "#version " #version "\n" #shader
const char* vert = GLSL
(
    110,

    varying vec4 position;
    varying vec3 normal;
    varying out vec4 texCoord;
    varying vec2 coord;
    void main()
    {
        position    = gl_ModelViewMatrix * gl_Vertex;
        normal      = normalize( gl_NormalMatrix * gl_Normal.xyz );
        gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
        coord       = vec2(gl_MultiTexCoord0);
    } 
);


    


const char* frag  = GLSL
(
    110,
        
    uniform sampler2D tex1;
    varying vec4 position;
    varying vec3 normal;
    varying vec2 coord;
    
    void main()
    {
         gl_FragColor = texture2D(tex1, coord);
    } 
);

编辑 2:

我是这样设置 gl 的:(也许某些东西与我的纹理着色器冲突,但我不这么认为!

 /* set up depth-buffering */
   glEnable(GL_DEPTH_TEST);

   glEnable(GL_POLYGON_SMOOTH);
   glHint(GL_POLYGON_SMOOTH_HINT, GL_FASTEST);

   /* set up lights */
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();

   glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
   glShadeModel(GL_SMOOTH);

   GLfloat lightpos[]   = { 3.0, 0.0, 1.0, 0.0 };
   GLfloat lightcolor[] = { 0.5, 0.5, 0.5, 1.0 };
   GLfloat ambcolor[]   = { 0.5, 0.5, 0.5, 1.0 };

   glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambcolor);

   glEnable(GL_LIGHTING);
   glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);

   glEnable  (GL_COLOR_MATERIAL);
   glLightfv (GL_LIGHT0,GL_POSITION,lightpos);
   glLightfv (GL_LIGHT0,GL_AMBIENT,ambcolor);
   glLightfv (GL_LIGHT0,GL_DIFFUSE,lightcolor);
   glLightfv (GL_LIGHT0,GL_SPECULAR,lightcolor);
   glLightf  (GL_LIGHT0,GL_CONSTANT_ATTENUATION,0.2);
   glLightf  (GL_LIGHT0,GL_LINEAR_ATTENUATION,0.0);
   glLightf  (GL_LIGHT0,GL_QUADRATIC_ATTENUATION,1.0);
   glEnable  (GL_LIGHT0);
   glEnable(GL_TEXTURE_2D);

用纯色替换 gl_FragColor 效果很好。 我知道可能与 coord 参数有关,但我正在尝试我发现的所有东西,但没有任何东西适合我。

内部纹理格式GL_BGR无效。 GL_BGR 对源纹理的格式有效,但内部表示必须是 GL_RGB.
参见 glTexImage2D

像这样调整您的代码:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, data);

请参阅 Khronos 参考页 GLAPI/glTexImage2D,上面写着:

To define texture images, call glTexImage2D. The arguments describe the parameters of the texture image, such as height, width, width of the border, level-of-detail number (see glTexParameter), and number of color components provided. The last three arguments describe how the image is represented in memory.

format​ determines the composition of each element in data​. It can assume one of these symbolic values:

GL_BGR: Each element is an RGB triple. The GL converts it to floating point and assembles it into an RGBA element by attaching 1 for alpha. Each component is clamped to the range [0,1].