所以我正在学习图形课程而且我正在编写着色器。在本课程中,我们可以访问运行webgl的服务以及一堆C ++代码进行编译,以获得一些具有少量模型的环境。但是,我是否在Windows或Linux上编译此代码并不重要,我不能得到我应该得到的结果。
所以这是我使用与此结果完全相同的glsl代码的结果:
我还没有编写足够的C ++来调试程序,但我怀疑程序本身有一个错误而不是着色器,所以我想知道是否有人可以从经验中说出这是什么类型的问题然后我将尝试找到可以处理它的代码。
我的猜测是它与法线有关,但我并不完全确定,因为我刚开始使用图形而且两年前我正确地做了线性代数。因为我不知道C ++源代码(我现在正在分析它,所以我可以理解它的流程)我不知道在哪里调试。
顶点着色器:
....
attribute vec3 VertexPosition
attribute vec2 VertexST
attribute vec3 VertexNormal
....
void main(void) {
Position = ProjectionMatrix * ViewMatrix * WorldMatrix * vec4 (VertexPosition, 1);
Normal = normalize ((ViewMatrix * WorldMatrix * vec4 (VertexNormal, 0)).xyz);
EyeSpaceLightPosition = ViewMatrix * LightPosition;
EyeSpaceVertexPosition = ViewMatrix * WorldMatrix * vec4 (VertexPosition, 1);
EyeSpaceObjectPosition = ViewMatrix * WorldMatrix * vec4 (0, 0, 0, 1);
STCoords = VertexST;
gl_Position = Position;
}
像素着色器:
void main(void) {
fragColor = vec4 (Normal, 1.0);
gl_FragColor = fragColor;
}
此代码实际上正在运行。以前有声明和东西,但是。实际文件中有更多代码,但它们会被注释,因此这些行不会运行。
答案 0 :(得分:-1)
所以问题解决了,原因是在顶点着色器中有三个声明告诉着色器数组中信息的排序方式。它说:
attribute vec3 VertexPosition;
attribute vec2 VertexST;
attribute vec3 VertexNormal;
这是错误的,因为从CPU提供给GPU的信息实际上是按Position,Normal,ST排序的。
这意味着他们应该切换,发生的事情是着色器接收了错误的信息,然后将其发送到像素处理器,这是试图在没有任何法线的情况下进行照明(因为我相信在这种情况下我们没有ST信息) ,我认为是纹理坐标。)
这使得模型在问题的第一张图片中没有正确渲染,但在切换这些线后:
attribute vec3 VertexPosition;
attribute vec3 VertexNormal; // Switched these two
attribute vec2 VertexST; //
现在,着色器正确地解释了给它的信息,结果就是预期的结果。
编辑:这是程序实际定义的内容,可以通过不同方式完成。但是对于我的作业,我获得了该计划的情况,这是按此顺序进行的。但正如评论者所说,这取决于。但问题仍然是程序中的声明顺序与着色器中的顺序不同。