Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl ATI glsl点精灵问题_Opengl_Glsl_Sprite_Point_Glpointsize - Fatal编程技术网

Opengl ATI glsl点精灵问题

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

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

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

还有一个片段着色器,它使用gl_Pointcoord读取纹理并设置片段颜色。 在我的C++程序中,我试图绑定TILYLIZE如下:
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吗?编译器优化代码并排除未使用的一致性是正常的,即当您注释line
gl\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;