gpt4 book ai didi

opengl - 为什么我的 OpenGL Phong 着色器表现得像平面着色器?

转载 作者:行者123 更新时间:2023-12-03 06:09:05 27 4
gpt4 key购买 nike

过去几周我一直在学习 OpenGL,但在实现 Phong 着色器时遇到了一些麻烦。尽管我使用了 smooth 限定符,但它似乎没有在顶点之间进行插值。我在这里错过了什么吗?为了给予应有的赞扬,顶点和片段着色器的代码大量抄袭OpenGL SuperBible第五版。我强烈推荐这本书!

顶点着色器:

#version 330
in vec4 vVertex;
in vec3 vNormal;
uniform mat4 mvpMatrix; // mvp = ModelViewProjection
uniform mat4 mvMatrix; // mv = ModelView
uniform mat3 normalMatrix;
uniform vec3 vLightPosition;
smooth out vec3 vVaryingNormal;
smooth out vec3 vVaryingLightDir;

void main(void) {
vVaryingNormal = normalMatrix * vNormal;
vec4 vPosition4 = mvMatrix * vVertex;
vec3 vPosition3 = vPosition4.xyz / vPosition4.w;
vVaryingLightDir = normalize(vLightPosition - vPosition3);
gl_Position = mvpMatrix * vVertex;
}

片段着色器:

#version 330
out vec4 vFragColor;
uniform vec4 ambientColor;
uniform vec4 diffuseColor;
uniform vec4 specularColor;
smooth in vec3 vVaryingNormal;
smooth in vec3 vVaryingLightDir;

void main(void) {
float diff = max(0.0, dot(normalize(vVaryingNormal), normalize(vVaryingLightDir)));
vFragColor = diff * diffuseColor;
vFragColor += ambientColor;
vec3 vReflection = normalize(reflect(-normalize(vVaryingLightDir),normalize(vVaryingNormal)));
float spec = max(0.0, dot(normalize(vVaryingNormal), vReflection));

if(diff != 0) {
float fSpec = pow(spec, 32.0);
vFragColor.rgb += vec3(fSpec, fSpec, fSpec);
}

}

这张来自维基百科的(公共(public)领域)图像准确地显示了我得到的图像类型以及我的目标——我得到的是“平面”图像,但我想要的是“Phong”图像。

任何帮助将不胜感激。谢谢!

编辑:如果有什么不同,我正在使用 PyOpenGL 3.0.1 和 Python 2.6。

编辑2:

解决方案

事实证明问题出在我的几何形状上;科斯是对的。对于其他在 Blender 模型中遇到此问题的人,Kos 指出,执行 Edit->Faces->Set Smooth 即可解决问题。我发现 Wings 3D 可以“开箱即用”。

最佳答案

作为这个答案的补充,这里有一个简单的几何着色器,它可以让你可视化你的法线。根据您的属性位置以及发送矩阵的方式,根据需要修改随附的顶点着色器。

但首先,我们的 friend 斯坦福兔子提供了一张巨大的兔子头的照片作为结果的示例!

normals for the Stanford bunny

主要警告:请注意,我使用模型 View 矩阵而不是正确的法线矩阵来转换法线。如果您的模型 View 包含非均匀缩放,则这将无法正常工作。另外,法线的长度可能不正确,但如果您只想检查它们的方向,那么这并不重要。

顶点着色器:

#version 330

layout(location = 0) in vec4 position;
layout(location = 1) in vec4 normal;
layout(location = 2) in mat4 mv;

out Data
{
vec4 position;
vec4 normal;
vec4 color;
mat4 mvp;
} vdata;

uniform mat4 projection;

void main()
{
vdata.mvp = projection * mv;
vdata.position = position;
vdata.normal = normal;
}

几何着色器:

#version 330
layout(triangles) in;
layout(line_strip, max_vertices = 6) out;

in Data
{
vec4 position;
vec4 normal;
vec4 color;
mat4 mvp;
} vdata[3];

out Data
{
vec4 color;
} gdata;

void main()
{
const vec4 green = vec4(0.0f, 1.0f, 0.0f, 1.0f);
const vec4 blue = vec4(0.0f, 0.0f, 1.0f, 1.0f);

for (int i = 0; i < 3; i++)
{
gl_Position = vdata[i].mvp * vdata[i].position;
gdata.color = green;
EmitVertex();

gl_Position = vdata[i].mvp * (vdata[i].position + vdata[i].normal);
gdata.color = blue;
EmitVertex();

EndPrimitive();
}
}

片段着色器:

#version 330

in Data
{
vec4 color;
} gdata;

out vec4 outputColor;

void main()
{
outputColor = gdata.color;
}

关于opengl - 为什么我的 OpenGL Phong 着色器表现得像平面着色器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4703432/

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