我有使用SDF函數關於GLSL球體跟蹤/光線跟蹤一些問題:GLSL:如何使用投影矩陣計算光線方向?
我的主程序(C++,使用福爾康)生成畫面四並將該頂點着色器與每頂點inPosition
。頂點着色器可以訪問窗口分辨率,投影矩陣和視圖矩陣。投影矩陣由glm::perspective(45.0, 1920/1080, 0.1, 100.0);
生成。
在頂點着色器中,我嘗試通過圖像平面計算從原點vec4(0.0, 0.0, 0.0, 1.0)
來的光線(使用齊次座標的位置和方向)。我很困惑放置圖像平面的位置,現在選擇vec4(inPosition.xy, -5.0, 1.0)
來查看負Z軸。
以下代碼表示我的頂點着色器:
#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