当我尝试对纹理进行采样时,GLSL Shader会变黑

时间:2017-09-21 09:18:05

标签: c opengl glsl texture-mapping

我以这种方式渲染三角形条带,并且使用基本旁路着色器一切正常: 编辑: 我添加了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);
    } 
);

EDIT2:

我正在以这种方式设置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参数有关,但我正在尝试我找到的所有东西,没有什么对我有用。

非常感谢!

1 个答案:

答案 0 :(得分:2)

内部纹理格式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,其中包含:

  

要定义纹理图像,请调用glTexImage2D。参数描述纹理图像的参数,例如高度,宽度,边框宽度,细节级别数(请参阅glTexParameter)和提供的颜色分量数。最后三个参数描述了图像在内存中的表示方式。   

  format确定数据中每个元素的组成。它可以假设这些符号值之一:   

  GL_BGR:   每个元素都是RGB三元组。 GL将其转换为浮点,并通过为alpha附加1将其组装成RGBA元素。每个组件都被钳制到[0,1]范围内。