C++ OpenGL 3.x核心采样器2drect(GL\u纹理\u矩形)示例

C++ OpenGL 3.x核心采样器2drect(GL\u纹理\u矩形)示例,c++,opengl,sfml,opengl-3,C++,Opengl,Sfml,Opengl 3,我正在试图找出如何在我的3D场景上制作半透明的2D覆盖,阅读OpenGL SuperBible第五版以供参考 它有一个例子,使用纹理目标GL_texture_矩形和称为sampler2DRect的GLSL统一类型将OpenGL徽标覆盖在场景上(在第7章)。应该使用纹理()命令在片段着色器中显示纹理 本书中的示例使用了许多源文件,我在一个简单的程序中实现它时遇到了很大的困难,所以我想知道是否有人能给我举一个简单的Sampler2Direct示例 对于切换到正交投影的部分,我没有任何问题,相反,当我

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

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

本书中的示例使用了许多源文件,我在一个简单的程序中实现它时遇到了很大的困难,所以我想知道是否有人能给我举一个简单的Sampler2Direct示例

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

另外,我正在使用SFML2.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) 
     .....
这是一种非常冗长的方式,告诉您没有这样的函数将
mat4
vec3
相乘。然后它列出了
mul
的所有合法变体

当您乘以矩阵时,您的维度必须匹配,您可能需要将
mat4
vec4
相乘。如果这是位置坐标,则添加一个
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_纹理_2D)
和矩形纹理的特殊项目:

  • UV坐标位于[0,宽度]x[0,高度](矩形纹理的特例)
  • 确保四边形的大小与纹理大致相同(rect.tex没有mipmap)
  • 改用标准纹理。他们可以是NPOT

另外:使用gDebugger。

这并不是一个要求教程的合适地方(谷歌可能会为您提供更好的服务),不过如果您想保留您所获得的内容,请随时将您的代码添加到此帖子中。根据我的经验,白色纹理通常是由几个不同的错误造成的,调试起来并不困难。你也试过glGetError吗?我在谷歌上搜索了一个多星期,什么也找不到。还没有尝试过glGetError(),但现在我会尝试,因为您已经提出了建议。我并不反对分享我的代码,我只是觉得在这一点上,任何人都无法合理地浏览。我主要是希望有人能推荐另一本带有简单例子的教科书,或者一些隐藏在谷歌面前的在线例子。。。感谢您的回复,我现在还不想扔掉代码,因为您说白色纹理易于调试!隐马尔可夫模型。。。我的渲染函数中的某些内容导致GL_INVALID_操作出于某种原因,在我在着色器处理程序中调用glUseProgram()后设置了GL_INVALID_操作。。。我尝试将调用移动到不同的位置,但无法修复错误。您是否检查了着色器以确保它们成功编译和链接?编译和链接后,请分别查看glGetShaderiv和glGetProgramiv的GL_编译状态和GL_链接状态。另请参见glGetShaderInfoLog和glGetProgramInfoLog。谢谢,这样做会导致glGetShaderiv()和glGetProgramiv()返回1(我猜1是GL_TRUE),并导致信息日志返回零长度,但是,调用glGetShaderInfoLog()似乎会导致502错误(既然着色器已修复,调用glUseProgram时502不再发生).所有这些的副作用是现在我的白色方块消失了…我不会放弃,我会继续胡闹,直到有人有更多的想法。谢谢你帮助我度过这段时间!谢谢卡尔文,我的纹理现在正在显示,但在白色表面上…我的目标是使表面透明而不是白色(纹理图像使用alpha透明度),因此我是否需要将一些颜色数据发送到其中一个着色器以将曲面从白色更改为透明?导致我的纹理之前无法显示的问题是,我使用的是glBindAttribLocation()用数字0表示我的顶点,用数字2表示纹理坐标,但我没有用数字1表示任何东西。因此,中间有一个未使用的数字使其无法显示。好的,在将一些颜色数据发送到着色器(alpha值为0.0)后,所有这些都正常工作。耶!谢谢Tim和Calvin1602!!