2

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

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

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

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

PS 我正在使用 SFML 2.0rc 来加载图像文件,以防万一。

4

2 回答 2

3
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) 
     .....

这是一种非常冗长的方式来告诉您没有将 amat4与 a相乘的函数vec3。然后列出mul.

当您将矩阵相乘时,您的尺寸必须匹配,您可能想要的是将 amat4与 a相乘vec4。如果这是您的位置坐标,则添加 a1.0作为向量的最终值:

uniform mat4 mvpMatrix;
in vec3 position;

main()
   gl_Position = mvpMatrix * vec4(position, 1.0);
于 2012-08-21T03:07:37.477 回答
2

除了蒂姆的回答,请确保:

  • 您的纹理已绑定: 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 没有 mipmap)
  • 请改用标准纹理。它们可以是 NPOT。

另外:使用 gDebugger。

于 2012-08-23T16:35:17.827 回答