나는 SDF 기능을 사용하여 GLSL에서 구 추적/레이 행진에 관한 몇 가지 문제가있다. 버텍스 쉐이더는 윈도우 해상도, 프로젝션 매트릭스 및 뷰 매트릭스에 액세스 할 수 있습니다. 투영 행렬은 glm::perspective(45.0, 1920/1080, 0.1, 100.0);
으로 생성됩니다.GLSL : 투영 행렬을 사용하여 광선 방향을 계산하는 방법은 무엇입니까? 가 화면에 쿼드를 생성하고 버텍스 쉐이더를 제공합니다 (VULKAN를 사용하여, C++)</p> <p>내 주요 프로그램 당 정점 <code>inPosition</code> :
버텍스 셰이더에서는 이미지 평면을 통해 vec4(0.0, 0.0, 0.0, 1.0)
에있는 원점에서 오는 광선 (위치와 방향이 균질 좌표로 계산 됨)을 계산하려고합니다. 나는 이미지 평면을 어디에 두어야하는지 혼란스럽고 이제는 음수의 z 축을 보려고 vec4(inPosition.xy, -5.0, 1.0)
을 선택했습니다.
#version 450
#extension GL_ARB_separate_shader_objects : enable
struct Ray
{
vec4 pos;
vec4 dir;
};
layout(binding = 0) uniform UniformBufferObject {
vec3 res;
mat4 projection;
mat4 view;
} ubo;
layout(location = 0) in vec3 inPosition;
layout(location = 0) out vec3 iResolution;
layout(location = 1) out Ray iRay;
out gl_PerVertex {
vec4 gl_Position;
};
void main() {
fragCoord = vec2(
((inPosition.x+1)/2) * (ubo.res.x-1),
((inPosition.y+1)/2) * (ubo.res.y-1)
);
iResolution = ubo.res;
gl_Position = vec4(inPosition, 1.0);
vec4 direction = inverse(ubo.projection) * vec4(inPosition.xy, -5.0, 1.0);
iRay.dir = direction;
iRay.pos = vec4(direction.xy, 0.0, 1.0);
}
내가 세계 공간으로 방향을 전환하고 창 해상도 단위 큐브를 왜곡하는 투영 행렬을 사용 :
다음 코드는 내 버텍스 쉐이더를 나타냅니다. 그러나 내 프래그먼트 쉐이더에서는 SDF 함수와 교차가 제대로 작동하지 않습니다. 거리와 반경에 대해 동일한 값을 설정하면 구를 볼 수 있습니다. 프래그먼트 셰이더를 참조하십시오 :
#version 450
#extension GL_ARB_separate_shader_objects : enable
struct Ray
{
vec4 pos;
vec4 dir;
};
layout(location = 0) in vec3 iResolution;
layout(location = 1) in Ray iRay;
layout(location = 0) out vec4 outColor;
float sdfSphere(vec3 p, float r)
{
return length(p) - r;
}
bool intersect(Ray ray)
{
for(int i = 0; i < 100; i++) {
float hit = sdfSphere((ray.pos.xyz + vec3(0.0, 0.0, -11.0)), 11.0);
ray.pos += hit * ray.dir;
if (hit < 0.001) {
return true;
}
}
return false;
}
void main()
{
bool result = intersect(iRay);
if(result == false) {
outColor = vec4(0.0, 0.0, 0.0, 1.0);
} else {
outColor = vec4(1.0, 0.0, 0.0, 1.0);
}
}
제 질문은 : 올바르게 투영 매트릭스를 적용해야합니까? 그리고 이미 제대로 적용 되었다면 왜 SDF 영역에 다른 위치/반지름을 설정할 수 없습니까?
Vulkan을 사용하는 경우 OpenGL 태그 대신에 태그를 지정해야합니다. – BDL