我目前正在使用这个glsl文件来处理我试图显示的3d对象的照明。我不确定需要为light_position_world、Ls、Ld、La、Ks、Kd、Ka、Ia和fragment_color输入什么值。我试图照亮的场景大致以(427,385,89)为中心。我不需要它是完美的,但我需要一些价值观,让我在屏幕上看到我的设计,这样我就可以操纵它们,了解这一切是如何工作的。任何额外的提示或解释都将不胜感激。谢谢!
#version 410
in vec3 position_eye, normal_eye;
uniform mat4 view_mat;
// fixed point light properties
vec3 light_position_world = vec3 (427.029, 385.888, 0);
vec3 Ls = vec3 (1.0f, 0.0f, 0.0f);
vec3 Ld = vec3 (1.0f, 0.0f, 0.0f);
vec3 La = vec3 (1.0f, 0.2f, 0.0f);
// surface reflectance
vec3 Ks = vec3 (1.0f, 1.0f, 1.0f);
vec3 Kd = vec3 (1.0f, 0.8f, 0.72f);
vec3 Ka = vec3 (1.0f, 1.0f, 1.0f);
float specular_exponent = 10.0; // specular 'power'
out vec4 fragment_colour; // final colour of surface
void main () {
// ambient intensity
vec3 Ia = vec3 (0, 0, 0);
// diffuse intensity
// raise light position to eye space
vec3 light_position_eye = light_position_world; //vec3 (view_mat * vec4 (light_position_world, 1.0));
vec3 distance_to_light_eye = light_position_eye - position_eye;
vec3 direction_to_light_eye = normalize (distance_to_light_eye);
float dot_prod = dot (direction_to_light_eye, normal_eye);
dot_prod = max (dot_prod, 0.0);
vec3 Id = Ld * Kd * dot_prod; // final diffuse intensity
// specular intensity
vec3 surface_to_viewer_eye = normalize (-position_eye);
// blinn
vec3 half_way_eye = normalize (surface_to_viewer_eye + direction_to_light_eye);
float dot_prod_specular = max (dot (half_way_eye, normal_eye), 0.0);
float specular_factor = pow (dot_prod_specular, specular_exponent);
vec3 Is = Ls * Ks * specular_factor; // final specular intensity
// final colour
fragment_colour = vec4 (255, 25, 25, 0);
}发布于 2018-03-21 04:07:22
你的代码有一些问题。
1)假设light_position_world是灯光在世界空间中的位置,灯光位于场景下方。这样场景就不会从上方被照亮。
2)假设*_eye表示eye空间中的坐标,*_world表示世界空间中的坐标,则不能通过简单地指定向量在这些空间之间进行交换。你必须使用视图矩阵和它的逆视图矩阵分别从世界空间到眼睛空间和从眼睛空间到世界空间。
3)着色器的输出颜色fragment_colour始终设置为暗红色。所以编译器会省略所有的光照计算。你必须使用这样的东西:fragment_colour = Ia + Id * material + Is * material,其中material是你的材料的颜色-例如,灰色代表金属。
看起来你并不了解基础知识。我建议你在OpenGL中阅读一些关于照明和变换/数学的文章或教程。
如果您已经阅读了相当多的文献,请尝试使用您的代码。试一试,不同的计算有什么作用,以及它们如何影响最终产品。无论如何,你不会得到100%精确的照明,所以不会出任何问题。
https://stackoverflow.com/questions/49368776
复制相似问题