【发布时间】: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