gpt4 book ai didi

c++ - GLSL 每像素点光着色

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:24:59 25 4
gpt4 key购买 nike

VC++、OpenGL、SDL

我想知道是否有一种方法可以在单个四边形几何体上实现更平滑的着色。现在,我的点光源的阴影看起来很平滑,但是,强度沿着面部的 [/] 对角线 segmentation 增加。光照在顶点之间基本上是不可见的。

enter image description here

enter image description here

enter image description here

这是光线从左向右移动时发生的情况

当我在表面上移动光线时,它会始终如一地这样做。在每个顶点处变得最亮,然后从那里逐渐变暗。

我是否被迫提高 segmentation 以获得更平滑、更径向的阴影?或者有解决这个问题的方法吗?

这是我正在使用的着色器:

垂直

varying vec3 vertex_light_position;
varying vec3 vertex_normal;

void main()
{
vertex_normal = normalize(gl_NormalMatrix * gl_Normal);
vertex_light_position = normalize(gl_LightSource[0].position.xyz);

gl_FrontColor = gl_Color;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

片段

varying vec3 vertex_light_position;
varying vec3 vertex_normal;

void main()
{
float diffuse_value = max(dot(vertex_normal, vertex_light_position), 0.0);
gl_FragColor = gl_Color * diffuse_value;
}

我的几何以防万一有人想知道:

glBegin(GL_QUADS);
glNormal3f(0.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(pos_x, pos_y - size_y, depth);
glTexCoord2f(1.0f, 1.0f); glVertex3f(pos_x + size_x, pos_y - size_y, depth);
glTexCoord2f(1.0f, 0.0f); glVertex3f(pos_x + size_x, pos_y, depth);
glTexCoord2f(0.0f, 0.0f); glVertex3f(pos_x, pos_y, depth);
glEnd();

最佳答案

我认为有几件事可能是问题。

除非我弄错了,否则您正在使用 normalize(gl_LightSource[0].position.xyz); 来计算光 vector ,但这完全基于光的位置,而不是您正在操作的顶点。这意味着每个顶点的值都是相同的,并且只会根据当前的模型 View 矩阵和灯光位置而变化。我认为通过执行诸如 normalize(glLightSource[0].position.xyz - (gl_ModelViewMatrix * gl_Vertex).xyz) 之类的操作来计算光 vector 会更接近您想要的结果。

其次,您应该在片段着色器和顶点着色器中归一化您的 vector ,因为不能保证两个单位 vector 的插值本身就是一个单位 vector 。

关于c++ - GLSL 每像素点光着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8531478/

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