2012-10-01 82 views
1

我刚将我的渲染代码移到我的笔记本电脑上,并遇到与opengl和glsl有关的问题。ATI 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)(如果这是相关的......)。

编辑我已经改变了问题的标题,以更好地反映问题。

+0

我认为可能有关的第二个问题是,当我有12px点精灵渲染(在vert着色器中使用gl_pointsize = 12)时,gl_PointCoord似乎没有在每个精灵中变化... – user1483596

+0

您是否检查过如果程序成功编译并通过glValidateProgram和glGetProgramiv链接?你总是得到-1的单一位置?编译器优化代码并排除未使用的制服是正常的,例如,当您注释行“gl_PointSize = tile_size;'时。您是否尝试在GLSL文件的开头设置版本?另外,检查你的其他机器(驱动程序)是否支持GL_PROGRAM_POINT_SIZE。我有一次和你一样的问题。原来,我只需要将_EXT附加到GL_PROGRAM_POINT_SIZE :)另外,“_VERTEX_”真的是该定义的(需要)部分吗? –

+0

感谢您的建议,程序正在编译和链接正常。我总是得到-1的tile_size统一的位置。其他制服(浮动和sampler2D)和属性绑定罚款。我没有版本号,但没有添加任何更改。我已经尝试glEnable GL_PROGRAM_POINT_SIZE,GL_PR ..._ SIZE_EXT,GL_VERTEX_PROGRAM_POINT_SIZE及其组合,但似乎没有任何工作。 – user1483596

回答

1

您在制服之前忘了拨打glUseProgram

+0

没有抱歉,我一直不清楚,我已经设置了程序,我只包括试图设置制服的片段。正如我所说,完全相同的代码在另一台机器上工作正常,所以我认为设置没问题。 – user1483596

1

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

我认为有关gl_PointSize的内容已被破坏(至少在我的卡上);在顶点着色器中,我能够使用gl_PointSize=8.0;获得8像素点精灵,但使用gl_PointSize=tile_size;给了我1像素精灵,无论我尝试绑定到统一的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不在其他地方使用)。

没有这条线我所有的颜色变蓝,我的纹理查找打破。