首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用glsl在C++中进行照明

使用glsl在C++中进行照明
EN

Stack Overflow用户
提问于 2018-03-20 01:16:49
回答 1查看 177关注 0票数 0

我目前正在使用这个glsl文件来处理我试图显示的3d对象的照明。我不确定需要为light_position_world、Ls、Ld、La、Ks、Kd、Ka、Ia和fragment_color输入什么值。我试图照亮的场景大致以(427,385,89)为中心。我不需要它是完美的,但我需要一些价值观,让我在屏幕上看到我的设计,这样我就可以操纵它们,了解这一切是如何工作的。任何额外的提示或解释都将不胜感激。谢谢!

代码语言:javascript
复制
#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);
}
EN

回答 1

Stack Overflow用户

发布于 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%精确的照明,所以不会出任何问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49368776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档