OpenGL 3.x核心sampler2DRect(GL_TEXTURE_RETANGLE)示例

OpenGL 3.x core sampler2DRect (GL_TEXTURE_RECTANGLE) example

本文关键字:TEXTURE RETANGLE 示例 GL 核心 sampler2DRect OpenGL      更新时间:2023-10-16

我正试图弄清楚如何在我的3D场景上制作半透明的2D覆盖图,阅读OpenGL SuperBible第5版以供参考。

它有一个例子,使用纹理目标GL_texture_RETANGLE和名为sampler2DRect的GLSL统一类型将OpenGL徽标覆盖在场景上(在第7章中)。纹理应该使用texture()命令显示在片段着色器中。

这本书中的例子使用了许多源文件,我很难在一个简单的程序中实现它,所以我想知道是否有人能给我举一个更简单的sampler2DRect例子。

我对切换到正交投影的部分没有任何问题,相反,当我尝试加载纹理时,它只是以白色显示曲面。我的代码在这一点上变得非常混乱,我似乎无法确定问题所在,所以我宁愿从头开始,如果在任何地方都有更简单的示例的话。

附言:我使用SFML 2.0rc来加载图像文件,以防它很重要。

error C1101: ambiguous overloaded function reference "mul(mat4, vec3)" 
     (0) : mat3x4 mul(mat3x1, mat1x4)
     (0) : mat3 mul(mat3x1, mat1x3) 
     (0) : mat3x2 mul(mat3x1, mat1x2) 
     (0) : mat3x1 mul(mat3x1, mat1) 
     (0) : mat2x4 mul(mat2x1, mat1x4) 
     .....

这是一种非常冗长的方式来告诉你,没有这样的函数可以将mat4vec3相乘。然后它列出了mul的所有法律变体。

当您对矩阵进行乘法运算时,您的维度必须匹配,您可能想要的是将mat4vec4相乘。如果这是您的位置坐标,则添加1.0作为矢量的最终值:

uniform mat4 mvpMatrix;
in vec3 position;
main()
   gl_Position = mvpMatrix * vec4(position, 1.0);

除了Tim的答案外,还要确保:

  • 您的纹理已绑定:glBindTexture(GL_texture_2D,textureID)
  • 顶点着色器输出UV坐标:out vec2 UV
  • 顶点着色器获取UV坐标:在vec2 UV中
  • 具有UV的VBO存在、启用、绑定和设置(glEnableVertexAttribArray、glBindBuffer、glVertexAttribPointer)
  • glEnable(GL_TEXTURE_2D)

矩形纹理的特殊项目:

  • UV坐标为[0,width]x[0],height](矩形纹理的特殊情况)
  • 确保你的四边形与纹理大小大致相同(rect.tex没有mipmaps)
  • 请改用标准纹理。它们可以是NPOT

另外:使用gDebugger。