lee*_*mes 4 c++ shader qt glsl
我为光参数定义了一个结构,它包含两个向量.结构在C++和GLSL中以类似的方式定义(注意:QVector3D封装3 floats,而不是doubles):
C++主机程序:
struct LightParameters {
    QVector3D pos;
    QVector3D intensity;
};
片段着色器:
struct LightParameters {
    vec3 pos;
    vec3 intensity;
};
在片段着色器中,我还定义了以下制服.灯的数量限制为8,因此统一数组具有恒定的大小(但numLights实际上只使用):
const int maxLights = 8;
uniform int numLights;
uniform LightParameters lights[maxLights];
在宿主程序中,我定义灯光并将它们传递给着色器(QGLShaderProgram):
static const int maxLights = 8;
LightParameters lights[maxLights];
int numLights = 1;
lights[0].pos = {0, 1, 0};
lights[0].intensity = {1, 1, 1};
shaderProgram->bind();
shaderProgram->setUniformValue("numLights", numLights);
shaderProgram->setUniformValueArray("lights", reinterpret_cast<GLfloat*>(lights), maxLights, 6);
shaderProgram->release();
的6最后一个参数应说明,每个阵列元件使用6 GLfloat期从原料float数组,又名" 元组大小 ".
根据Qt文档,不应该使用6的元组大小(仅允许1,2,3,4).另一方面,QGLShaderProgram允许传入最多4x4个条目的矩阵.GLSL还允许结构中有超过4个浮子的制服(根据这个例子).
这导致了一个问题:
如何使用Qt将浮点数/向量的结构作为统一数组传递?如果使用Qt是不可能的,我会调用GL函数来执行此操作,但我很感兴趣Qt是否可以方便地为我执行此操作.
当然,无论如何我都尝试了上面的代码.它导致结构中的所有向量都设置为0.
当我在结构中删除第二个参数并使用3的元组大小时,代码仍然无效!但是,当仅vec3在着色器中使用时(仍然是宿主程序中具有一个QVector3D的结构,元组大小= 3),它可以工作.
所以问题似乎是自定义类型在OpenGL主机程序API中的处理方式不同,但Qt似乎不支持它.我目前使用两个统一的阵列(一个用于pos,一个用于强度)作为解决方法.
Nic*_*las 11
Qt与此无关.
您不能传递结构数组,就像它是一个值数组.如果您有一个类型不是基本类型的统一数组,那么每个数组索引和该结构的每个成员都有一个单独的统一位置和一个单独的统一名称.因此,您必须单独传递每个成员.
你必须这样做:
shaderProgram->setUniformValue("lights[0].pos", lights[0].pos);
shaderProgram->setUniformValue("lights[0].intensity", lights[0].intensity);
shaderProgram->setUniformValue("lights[1].pos", lights[1].pos);
shaderProgram->setUniformValue("lights[1].intensity", lights[1].intensity);
shaderProgram->setUniformValue("lights[2].pos", lights[2].pos);
shaderProgram->setUniformValue("lights[2].intensity", lights[2].intensity);
等等.
或者你可以使用一个合适的制服块并省去所有这些.