【问题标题】:Is it necessary to call glEnable(GL_TEXTURE) before using textures in OpenGL 2.1?在 OpenGL 2.1 中使用纹理之前是否需要调用 glEnable(GL_TEXTURE)?
【发布时间】:2015-10-09 10:19:05
【问题描述】:

在 OpenGL 2.1+ 中,我们需要在使用纹理之前调用glEnable(GL_TEXTURE) 吗?如果我们遇到纹理问题,可能是什么原因?

更新:

我正在使用 OpenGL 2.1 for Desktop,我的步骤是:

  1. 加载 bmp 24 位图像(我检查了 gDebuger,它显示我的纹理正常,所以我确定我的加载图像过程没有失败)。

  2. init()过程中调用几个OpenGL函数:

    glGenTextures(1, &texture_id);
    glBindTexture(GL_TEXTURE_2D, texture_id);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image_width, image_height, 0, GL_BGR, GL_UNSIGNED_BYTE, image_data);
    
  3. 在draw_scene()中:

    glUseProgram(program);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture_id);
    glUniform1i(uniform_texture, 0);
    ...
    
  4. 顶点着色器(版本 120):

    attribute vec3 vPos;
    attribute vec2 vTexCoord;
    
    uniform mat4 MV;
    uniform mat4 Projection;
    
    varying vec2 fragTexCoord;
    
    void main()
    {
        fragTexCoord = vTexCoord;
        gl_Position = Projection * MV * vPos;
    }
    
  5. 片段着色器:

    uniform sampler2D my_texture;
    varying vec2 fragTexCoord;
    
    void main()
    {
        gl_FragColor = texture2D(my_texture, fragTexCoord);
    }
    

【问题讨论】:

  • 如果您使用着色器,那么我怀疑glEnable(GL_TEXTURE) 会做什么。你能给我们一张你得到的截图,或者更详细地描述你的输出问题吗?
  • 我认为我的一些参数错误,我已经清除并重写了所有纹理代码,现在它可以工作了!谁能解释一下GL_RGBA8GL_RGBA、...在internalFormat 中有什么不同?如果我在internalFormat 中使用了GL_RGB,那么我可以在片段着色器中访问alpha 元素,例如:texture2D(myTexture, texCoord).a

标签: opengl textures


【解决方案1】:

如果您在 OpenGL 2.1 中使用 GLSL 着色器,则对 glEnable(GL_TEXTURE_*) 的调用没有任何意义。您在片段着色器中应用纹理。

如果您打算继续使用 OpenGL 3.x 核心配置文件,请记住 glEnable(GL_TEXTURE_*) 已弃用。

【讨论】:

    猜你喜欢
    • 2011-03-08
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多