gpt4 book ai didi

opengl - 太阳着色器不工作

转载 作者:行者123 更新时间:2023-12-02 02:23:39 24 4
gpt4 key购买 nike

我正在尝试让阳光着色器工作,但我无法让它工作。
我目前得到的是屏幕左下角的四分之一圆/省略号,它确实粘在我的屏幕上(如果我移动相机,它也会移动)。

我所做的就是渲染两个三角形以形成一个覆盖屏幕的四边形,屏幕宽度和高度统一。

顶点着色器

#version 430 core

void main(void) {
const vec4 vertices[6] = vec4[](
vec4(-1.0, -1.0, 1.0, 1.0),
vec4(-1.0, 1.0, 1.0, 1.0),
vec4(1.0, 1.0, 1.0, 1.0),

vec4(1.0, 1.0, 1.0, 1.0),
vec4(1.0, -1.0, 1.0, 1.0),
vec4(-1.0, -1.0, 1.0, 1.0)
);

gl_Position = vertices[gl_VertexID];
}

片段着色器

#version 430 core

layout(location = 7) uniform int screen_width;
layout(location = 8) uniform int screen_height;

layout(location = 1) uniform mat4 view_matrix;
layout(location = 2) uniform mat4 proj_matrix;

out vec4 color;

uniform vec3 light_pos = vec3(-20.0, 7.5, -20.0);

void main(void) {
//calculate light position in screen space and get x, y components
vec2 screen_space_light_pos = (proj_matrix * view_matrix * vec4(light_pos, 1.0)).xy;

//calculate fragment position in screen space
vec2 screen_space_fragment_pos = vec2(gl_FragCoord.x / screen_width, gl_FragCoord.y / screen_height);

//check if it is in the radius of the sun
if (length(screen_space_light_pos - screen_space_fragment_pos) < 0.1) {
color = vec4(1.0, 1.0, 0.0, 1.0);
}
else {
discard;
}
}

认为它的作用:

  • 获取太阳在屏幕空间中的位置 (light_pos)。
  • 获取屏幕空间中的片段位置。
  • 如果它们之间的距离低于某个值,则用黄色绘制片段;
  • 否则丢弃。

最佳答案

screen_space_light_pos 尚未进入剪辑空间。您错过了透视划分:

vec3 before_division = (proj_matrix * view_matrix * vec4(light_pos, 1.0)).xyw;
vec2 screen_space_light_pos = before_division.xy / before_division.z;

使用常见的 proj_matrix 配置,screen_space_light_pos 将位于 [-1,1]x[-1,1] 中。要匹配 screen_space_fragment_pos 范围,您可能需要调整 screen_space_light_pos:

screen_space_light_pos = screen_space_light_pos * 0.5 + 0.5;

关于opengl - 太阳着色器不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22286357/

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