Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GLSL/C++;:自定义着色器的默认行为_C++_Opengl_Glsl_Shader - Fatal编程技术网

C++ GLSL/C++;:自定义着色器的默认行为

C++ GLSL/C++;:自定义着色器的默认行为,c++,opengl,glsl,shader,C++,Opengl,Glsl,Shader,我有一些GLSL着色器正在正确编译,并且已成功连接到正确链接的程序。我已确认其他着色器在我的程序中工作正常。奇怪的是,我看到的结果似乎与默认着色器(颜色,无照明)的行为相同 我将粘贴顶点和片段着色器的源代码,以及我的C++源代码中所有与着色器相关的摘录。我将在注释中解释我的程序特有的任何函数或类 我的顶点着色器(包含在“dirlight.vs”中) 从C++主程序中的初始化摘录…< / P> //class program manages shaders Program shaders = Pr

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

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

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

从C++主程序中的初始化摘录…< / P>

//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);
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);

从主循环中摘录C++ main…< /p>

//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);
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);

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

我认为,在创建并设置当前OpenGL渲染上下文后,您正在创建程序对象,并在此后初始化扩展?到目前为止,Programm::addShaderFile是不透明的,具有该文件的源代码,Program::getUniformLoc可能会有所帮助。下次您询问GLSL问题时,请指定OpenGL版本和GLSL版本。您尚未提供着色器编译/加载例程的源代码,因此根据墨菲定律,我假设根本没有错误检查。您应该使用相应的API函数-glGetProgramiv和glGetShaderiv检查着色器编译状态和程序链接状态。链接/编译后,还要提取并读取着色器和程序的信息日志。出于调试目的,您可以在每次OpenGL调用后添加glGetError-着色器是否相关。如我在问题中所述,我已经通过加载其他自定义着色器确认加载着色器的方式没有任何问题。问题在于着色器本身或我处理制服/属性的方式。谢谢!设置最大长度有效!厉害。维德说它没有给我任何编译错误。我不知道它是否是NVIDIA编译器,但我有一个NVIDIA图形卡,如果这就是编译它的原因…@MilesRufat Latre是的,GLSL编译器是图形驱动程序的一部分。既然你在NVIDIA上,请看一看。除其他外,它允许您将GLSL编译器设置为“严格”,以便它停止接受CUDA构造。还有其他有趣的功能。
uniform vec4 lightdirs[];