【问题标题】:ATI glsl point sprite problemsATI glsl 点精灵问题
【发布时间】:2023-03-23 05:47:01
【问题描述】:

我刚刚将我的渲染代码移动到我的笔记本电脑上,并且遇到了 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 的程序,显示的只是关于这个特殊制服的 sn-p)

现在像这样设置,我得到一个像素点,发现 opengl 无法绑定 unif_tilesize(它被设置为 -1)。

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

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

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

【问题讨论】:

  • 我认为可能与之相关的第二个问题是,当我渲染 12px 点精灵时(在垂直着色器中使用 gl_pointsize = 12),gl_PointCoord 似乎在每个精灵中都没有变化。 .
  • 您是否检查过程序是否被glValidateProgram和glGetProgramiv成功编译和链接?你总是得到 -1 的 uni 位置吗?编译器优化代码并排除未使用的制服是正常的,即当您注释行 gl_PointSize = tile_size; 时。您是否尝试在 GLSL 文件的开头设置版本。另外,检查您的其他机器(驱动程序)是否支持 GL_PROGRAM_POINT_SIZE。我曾经遇到过类似你的问题。结果,我只需要将 EXT 附加到 GL_PROGRAM_POINT_SIZE :) 另外,“_VERTEX”真的是该定义的(需要)一部分吗?
  • 感谢您的建议,程序正在编译和链接正常。对于 tile_size 统一位置,我总是得到 -1。其他制服(float 和 sampler2D)和属性绑定得很好。我没有版本号,但没有更改就添加了它们。我已经尝试过 glEnable GL_PROGRAM_POINT_SIZE、GL_PR..._SIZE_EXT、GL_VERTEX_PROGRAM_POINT_SIZE 及其组合,但似乎没有任何效果。
  • 在谷歌上搜索驱动程序似乎表明很多人对 ATI 驱动程序和点精灵大小有疑问...看起来是时候编写一个新的渲染器了...
  • "运行 ATI radeon x1200" 一般来说,我不相信 任何 GLSL 代码可以在任何预高清 ATI 显卡上运行.它们是驱动程序错误的雷区,自从 ATI 多年前停止支持这些卡以来,这些错误都将永远无法修复。

标签: opengl glsl sprite point glpointsize


【解决方案1】:

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

【讨论】:

  • 不抱歉,我不清楚,我已经设置了程序,我只包含了用于尝试设置制服的 sn-p。正如我所说,完全相同的代码在另一台机器上运行良好,所以我认为设置很好。
【解决方案2】:

所以在玩了一天之后,虽然我还没有解决无法将制服绑定到 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 不在其他任何地方使用)。

没有这条线,我所有的颜色都会变成蓝色,我的纹理查找也会出错。

【讨论】:

    猜你喜欢
    • 2012-04-16
    • 1970-01-01
    • 2018-02-25
    • 2012-08-07
    • 2019-07-09
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多