gpt4 book ai didi

arrays - Qt 数组的 GLSL 统一始终为零

转载 作者:行者123 更新时间:2023-12-04 18:18:16 26 4
gpt4 key购买 nike

我正在使用 Qt。我有多个着色器在工作,但是传递统一数组似乎总是将全部设置为零。预期的结果是在纹理顶部绘制随机圆圈(或者由于圆圈太多而只是透明纹理)。我得到的是右下角的单个粒子圆圈。

if (program->isLinked()) {
QVector3D hitPoints[40];

for (int k = 0; k < 40; k++) {
hitPoints[k] = QVector3D((float)rand()/(float)RAND_MAX, (float)rand()/(float)RAND_MAX, (float)rand()/(float)RAND_MAX);
}

program->setUniformValueArray("hitPoints", hitPoints, 40);
program->bind();
}

片段着色器:
uniform sampler2D color_texture;
uniform vec3 hitPoints[40];


void main()
{
float dist = 0.3;
vec2 texcoord = vec2(gl_TexCoord[0]);
for (int i = 0; i < 40; i++) {
float close = sqrt(pow(hitPoints[i].y - texcoord.y, 2) + pow(hitPoints[i].x - texcoord.x, 2));
if (close < dist) {
gl_FragColor = vec4(0,0,0,texture2D(color_texture, texcoord).a);
return;
}
}
gl_FragColor = texture2D(color_texture, texcoord);
}

最佳答案

使用普通 OpenGL(没有 Qt)时,调用 glUniform仅在相应程序处于事件状态时才有效(使用 glUseProgram )。自从QGLShaderProgramsetUniformbind函数应该是 glUniform 的简单包装器和 glUseProgram分别,您应该将函数调用的顺序更改为:

program->bind();
program->setUniformValueArray("hitPoints", hitPoints, 40);

因此在程序绑定(bind)时总是设置程序的制服。但另一方面,uniforms 的值在程序的绑定(bind)和解除绑定(bind)上是持久的,因此如果它们不更改,则不必在每次绑定(bind)程序时都设置它们。

令人遗憾的是,文档没有说明这个问题。但由于它命名了由相应 Qt 函数包装的 GL 函数,我猜他们只是假设任何使用 OpenGL 的人无论如何都知道这些事实(实际上它们只是轻量级包装器,本身没有新接口(interface))。

关于arrays - Qt 数组的 GLSL 统一始终为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11278394/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com