OpenGL 3.x core sampler2DRect(GL_TEXTURE_RECTANGLE)示例

时间:2012-08-21 00:49:45

标签: c++ opengl sfml opengl-3

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

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

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

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

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

2 个答案:

答案 0 :(得分: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) 
     .....

这是一种非常冗长的方式告诉您,没有这样的功能可以将mat4vec3相乘。然后列出mul的所有合法变体。

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

uniform mat4 mvpMatrix;
in vec3 position;

main()
   gl_Position = mvpMatrix * vec4(position, 1.0);

答案 1 :(得分:2)

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

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

矩形纹理的特殊项目:

  • UV坐标为[0,宽度] x [0,高度](矩形纹理的特殊情况)。
  • 确保您的四边形有大约。与纹理大小相同(rect.tex不具有mipmap)
  • 请改用标准纹理。他们可以是NPOT。

另外:使用gDebugger。