【问题标题】:Changing the texture displayed in fragment shader更改片段着色器中显示的纹理
【发布时间】:2012-11-16 04:12:04
【问题描述】:

我正在尝试将 2 个纹理传递给着色器,但我对这里的工作有点困惑 这是opengl代码

    GLuint textures;
    GLuint textures1;</code>
    glGenTextures(1,&textures);
    glGenTextures(1,&textures1);
    glBindTexture(GL_TEXTURE_2D,textures);
    glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,256,256,0,GL_RGB,GL_UNSIGNED_BYTE,texImg);
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );

    glBindTexture(GL_TEXTURE_2D,textures1);
    glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,256,256,0,GL_RGB,GL_UNSIGNED_BYTE,texImg1);
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
    glBindTexture(GL_TEXTURE_2D,textures1);

    GLuint location1=glGetUniformLocation(programObjectFloor,"Tex1");
    GLuint location2=glGetUniformLocation(programObjectFloor,"Tex2");

    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D,textures1);
    glUniform1i(location2, 1);

    glActiveTexture(GL_TEXTURE0);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D,textures);
    glUniform1i(location1, 0);

顶点着色器是

attribute vec4 position; 
attribute vec4 texture;

uniform mat4 MVP;


varying vec4 ptexture; 

void main()
{
    ptexture = texture;     
    gl_Position = MVP * position; 
}

片段着色器是

varying vec4 ptexture; 

uniform sampler2D Tex1;
uniform sampler2D Tex2;
uniform bool swit;

void main() 
{
        gl_FragColor = texture2D(Tex1,ptexture.st);
} 

当我换行时

gl_FragColor = texture2D(Tex2,ptexture.st);

仍然只显示第一个纹理,但是当我注释掉下面的行时,显示了第二个纹理,你能解释一下为什么会这样吗?

//        glActiveTexture(GL_TEXTURE0);
//        glEnable(GL_TEXTURE_2D);
//        glBindTexture(GL_TEXTURE_2D,textures);
//        glUniform1i(location1, 0);

【问题讨论】:

  • glUseProgram 的电话在哪里?
  • 你的#version指令在哪里?

标签: opengl glsl texture-mapping multitexturing


【解决方案1】:

您必须先调用glUseProgram,然后再查询统一位置并为其赋值。很可能您稍后会切换程序,而将这些制服设置为未定义状态。

同样在使用着色器时,不需要glEnable(GL_TEXTURE_2D);,是否使用纹理由着色器的代码决定。

与您的问题无关,只是指出,在您查询统一位置之前,您有一个多余的电话到 glBindTexture

【讨论】:

    猜你喜欢
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 2019-01-23
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多