ATI glsl点精灵问题



我刚把渲染代码移到笔记本电脑上,opengl和glsl出现了问题。

我有一个像这样的顶点着色器(简化):

uniform float tile_size;
void main(void) {
gl_PointSize = tile_size;
// gl_PointSize = 12;
}

以及使用gl_ Pointcoord读取纹理并设置片段颜色的片段着色器。在我的c++程序中,我试图绑定tile_size,如下所示:

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无法绑定uniform_tilesize(它被设置为-1)。

如果我在顶点着色器中交换注释,我会得到12px的点精灵。

特别的是,我另一台电脑上的完全相同的代码运行得非常好。我的笔记本电脑上的opengl版本是2.1.8304,它运行的是ATI radeon x1200(在我的桌面上是nvidia 8800gt)(如果这是相关的…)

编辑我更改了问题标题以更好地反映问题。

您在设置统一之前忘记了调用glUseProgram

因此,经过又一天的游戏,我已经到了这样一个地步:尽管我还没有解决无法将制服绑定到gl_PointSize的原始问题,但我已经修改了现有的点精灵渲染器,使其能够在我的ATI卡(一个旧的x1200)上工作,并想分享我学到的一些东西。

我认为gl_PointSize的某些东西坏了(至少在我的卡上);在顶点着色器中,我可以使用gl_PointSize=8.0;获得8px的点精灵,但使用gl_PointSize=tile_size;可以获得1px的精灵,无论我试图绑定到统一tile_size。

幸运的是,我不需要每个顶点都有不同大小的瓦片,所以我在main.cpp中调用了glPointSize(tile_size),效果很好。

为了让gl_PointCoord在我的碎片着色器中工作(即返回(0,0)以外的值),我不得不在main.cpp中调用glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE );

仍然存在一个荒谬的问题,在这个问题中,我的变量在顶点着色器和片段着色器之间的某个地方被搞砸了。经过长时间的"猜测在谷歌中键入什么以获取相关信息"游戏,我发现(并很快丢失)了一个论坛,有人说,在未来的情况下,如果你不在至少一个着色器中使用gl_TexCoord[0],你的变体将被破坏。

为了解决这个问题,我在碎片着色器的末尾添加了一行:

_coord = gl_TexCoord[0].xy;

其中_coord是未使用的vec2。(注意gl_Texcoord在其他任何地方都没有使用)。

没有这条线,我所有的颜色都变成了蓝色,我的纹理查找也中断了。

最新更新