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

问题描述 投票:1回答:1

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

Aaditi:

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

非常感谢!

c opengl glsl texture-mapping
1个回答
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]范围内。

© www.soinside.com 2019 - 2024. All rights reserved.