gpt4 book ai didi

c++ - GLSL/C++ : Default behavior from custom shader

转载 作者:行者123 更新时间:2023-11-30 04:31:41 26 4
gpt4 key购买 nike

我有一些正确编译的 GLSL 着色器,并成功附加到正确链接的程序。我已确认其他着色器在我的程序中正常工作。奇怪的是,我看到的结果似乎与我从默认着色器(颜色,无照明)中得到的行为相同。

我将粘贴顶点着色器和片段着色器的源代码,以及我的 C++ 源代码中与着色器相关的所有摘录。我将在评论中解释我的程序独有的任何函数或类。

我的顶点着色器(包含在“dirlight.vs”中)

uniform int lightcount;
uniform vec4 lightdirs[];
uniform vec4 lightdifs[];
uniform vec4 lightambs[];
uniform vec4 lightposs[];

void main()
{
vec3 normal = normalize(gl_NormalMatrix * gl_Normal);
vec4 diffuse = vec4(0.0, 0.0, 0.0, 0.0);
for(int i = 0; i < lightcount; i++)
{
//Adding the diffuse term multiplied by gl_Color for each light.
//There should be no color (0,0,0,0) if the lights are null
diffuse += lightdifs[i] * max(dot(normal, normalize(lightdirs[i])), 0.0) * gl_Color;
}

gl_FrontColor = diffuse;
gl_Position = ftransform();
}

我的片段着色器(包含在“dirlight.fs”中)

void main()
{
gl_FragColor = gl_Color;
}

摘录自 C++ main 中的初始化...

//class program manages shaders
Program shaders = Program();
//attach a vertex shader, compiled from source in dirlight.vs
shaders.addShaderFile(GL_VERTEX_SHADER, "dirlight.vs");
//attach a fragment shader compiled from source in dirlight.fs
shaders.addShaderFile(GL_FRAGMENT_SHADER, "dirlight.fs");
//link program
shaders.link();
//use program
shaders.use();

//Program::getUniformLoc(const char* name) grabs the location
//of the uniform specified
GLint sTime = shaders.getUniformLoc("time");
GLint lightcount = shaders.getUniformLoc("lightcount");
GLint lightdir = shaders.getUniformLoc("lightdirs");
GLint lightdif = shaders.getUniformLoc("lightdifs");
GLint lightamb = shaders.getUniformLoc("lightambs");

glUniform1i(lightcount, 2);
GLfloat lightdirs[] = {-1.f, 1.f, 1.f, 1.f,
1.f, 1.f, -1.f, 1.f};
glUniform4fv(lightdir, 2, lightdirs);
GLfloat lightdifs[] = {1.f, 1.f, 1.f, 1.f,
1.f, 1.f, 1.f, 1.f};
glUniform4fv(lightdif, 2, lightdifs);
glUniform4f(lightamb, 0.4f, 0.4f, 0.4f, 1.f);

摘自 C++ main 中的主循环...

glUniform1f(sTime, newTime);
//This should cause the light directions to rotate around the origin
GLfloat lightdirs[] = {sinf(newTime * 2.f), 1.f, cosf(newTime * 2.0f), 1.f,
cosf(newTime * 2.f), 1.f, sinf(newTime * 2.0f), 1.f};
glUniform4fv(lightdir, 2, lightdirs);

最佳答案

uniform vec4 lightdirs[];

那不是合法的 GLSL。我无法解释为什么你的编译器允许编译(我猜这是一个 NVIDIA 编译器,对吧?那当然假设你正在检查编译/链接状态),但是统一数组必须有一个在着色器中明确定义的长度。如果你想要可变长度数组,你必须选择一个最大长度并将其烘焙到着色器中。着色器可以读取更少的值(基于您传入的制服的长度),但仅此而已。

关于c++ - GLSL/C++ : Default behavior from custom shader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8101404/

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