Opengl ATI glsl点精灵问题
我刚刚将渲染代码移到笔记本电脑上,opengl和glsl出现问题 我有这样一个顶点着色器(简化): 还有一个片段着色器,它使用gl_Pointcoord读取纹理并设置片段颜色。 在我的C++程序中,我试图绑定TILYLIZE如下:Opengl ATI glsl点精灵问题,opengl,glsl,sprite,point,glpointsize,Opengl,Glsl,Sprite,Point,Glpointsize,我刚刚将渲染代码移到笔记本电脑上,opengl和glsl出现问题 我有这样一个顶点着色器(简化): 还有一个片段着色器,它使用gl_Pointcoord读取纹理并设置片段颜色。 在我的C++程序中,我试图绑定TILYLIZE如下: glEnable(GL_TEXTURE_2D); glEnable(GL_POINT_SPRITE); glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); GLint unif_tilesize = glGetUniformLocati
glEnable(GL_TEXTURE_2D);
glEnable(GL_POINT_SPRITE);
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
GLint unif_tilesize = glGetUniformLocation(*shader program*, "tile_size");
glUniform1f(unif_tilesize, 12);
(为了澄清,我已经设置了一个使用glUseProgram的程序,图中所示的只是关于这种特殊制服的片段)
现在像这样设置,我得到一个像素点,并且发现opengl无法绑定unif_tilesize(它被设置为-1)
如果我在顶点着色器中交换注释,我可以得到12px的点精灵
特别是在我的另一台计算机上,完全相同的代码工作得非常好。我笔记本电脑上的opengl版本是2.1.8304,它运行的是ATI radeon x1200(请参阅我桌面上的nvidia 8800gt)(如果相关…)
编辑为了更好地反映问题,我已更改了问题标题。在设置制服之前,您忘记调用
GluseProgramm
。因此,在又一天的游戏之后,我已经到了一个地步,尽管我还没有解决无法将制服绑定到GLU PointSize的原始问题,我已经修改了我现有的点精灵渲染器,以便在我的ATI卡(一个旧的x1200)上工作,并想与大家分享我学到的一些东西
我认为关于gl_PointSize的一些东西被破坏了(至少在我的卡片上);在顶点着色器中,我能够使用gl_PointSize=8.0获得8px点精灵代码>,但使用gl\u PointSize=tile\u size代码>给了我1px的精灵,无论我试图绑定到统一的瓷砖大小
幸运的是,我不需要为每个顶点使用不同大小的平铺,因此我在main.cpp中调用了glPointSize(tile\u size)
,效果很好
为了使片段着色器中的gl\u PointCoord
工作(即返回除(0,0)以外的值),我必须调用glTexEnvf(gl\u POINT\u SPRITE\u ARB,gl\u COORD\u REPLACE\u ARB,gl\u TRUE)代码>在my main.cpp中
一直存在一个荒谬的问题,我的变量在顶点着色器和碎片着色器之间的某个地方被弄乱了。经过一场漫长的“猜猜谷歌输入什么来获取相关信息”的游戏后,我发现(并很快失去)一个论坛,有人说,在某些情况下,如果你不在至少一个着色器中使用gl_TexCoord[0]
,你的着色器将被破坏
为了解决这个问题,我在片段着色器的末尾添加了一行:
_coord = gl_TexCoord[0].xy;
其中_coord是一个未使用的vec2。(注:gl_Texcoord不在其他任何地方使用)
没有这条线,我的所有颜色都变蓝,纹理查找中断。我认为可能与之相关的第二个问题是,当我使用12px点精灵渲染时(在垂直着色器中使用gl_pointsize=12),gl_PointCoord在每个精灵中似乎没有变化……您是否检查了程序是否通过glValidateProgram和glGetProgramiv成功编译和链接?你在一个位置总是得到-1吗?编译器优化代码并排除未使用的一致性是正常的,即当您注释linegl\u PointSize=tile\u size代码>。您是否尝试在GLSL文件的开头设置版本。另外,检查您的其他机器(驱动程序)是否支持GL\U程序\U点\U大小。我曾经有过和你一样的问题。事实证明,我只需要在GL_程序_POINT_SIZE:)中添加EXT:)另外,“_VERTEX”真的是该定义(需要)的一部分吗?感谢您的建议,该程序正在编译和链接。对于瓷砖大小的统一位置,我总是得到-1。其他制服(浮标和2D)和属性绑定良好。我没有版本号,但添加了它们,没有任何更改。我试过glEnable GL\u程序\u POINT\u SIZE、GL\u PR…\u SIZE\u EXT、GL\u VERTEX\u程序\u POINT\u SIZE及其组合,但似乎都不起作用。通过谷歌搜索驱动程序,似乎可以看出很多人对ATI驱动程序和点精灵大小有问题。。。看起来是时候写一个新的渲染器了…“运行ATI radeon x1200”一般来说,我不相信任何GLSL代码能在任何预高清ATI图形卡上运行。它们是驱动程序错误的雷区,自从ATI几年前停止支持这些卡以来,没有一个会被修复。不抱歉,我不清楚,我已经设置了该程序,我只包括试图设置制服的片段。正如我所说,完全相同的代码在另一台机器上运行良好,因此我认为设置很好。
_coord = gl_TexCoord[0].xy;