1

我刚刚将我的渲染代码移动到我的笔记本电脑上,并且遇到了 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无法绑定unif_tilesize(它被设置为-1)。

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

特别是在我的另一台计算机上完全相同的代码工作得很好。我笔记本电脑上的 opengl 版本是 2.1.8304,它运行的是 ATI radeon x1200(参见我桌面上的 nvidia 8800gt)(如果这是相关的......)。

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

4

2 回答 2

1

glUseProgram你在设置制服之前忘记打电话了。

于 2012-10-01T18:34:57.500 回答
1

因此,在玩了一天之后,尽管我还没有解决无法将制服绑定到 gl_PointSize 的原始问题,但我已经修改了现有的点精灵渲染器以在我的 ATI 卡上工作(一个旧的 x1200)并认为我会分享一些我学到的东西。

我认为有关 gl_PointSize 的某些内容已损坏(至少在我的卡上);在顶点着色器中,我能够使用 8px 点精灵gl_PointSize=8.0;,但是gl_PointSize=tile_size;无论我试图绑定到统一的 tile_size,使用都给了我 1px 的精灵。

幸运的是,我不需要为每个顶点设置不同大小的图块,所以我调用glPointSize(tile_size)了 main.cpp,这很好。

为了gl_PointCoord在我的片段着色器中开始工作(即返回 (0,0) 以外的值),我必须调用glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE );我的 main.cpp。

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

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

_coord = gl_TexCoord[0].xy;

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

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

于 2012-10-03T13:49:29.337 回答