GLSL 上的光线追踪

问题描述 投票:0回答:1

我正在寻找在 GLSL 上使用光线追踪来模拟反射效果,但是我找不到与此主题相关的良好参考、示例或教程。当我得到一些有趣的数据时,该方法仅限于特定物体的表面(例如球体,立方体......);这不是我的情况。我也知道 GLSL 不支持递归函数,但据我所知光线追踪可以迭代完成。

我的目标是模拟声学传感器的混响过程,如下所示:通过光栅化进行初级反射;以及光线追踪的二次反射。当光线照射到物体表面时,就会测量距离和法线值。

遵循我当前的代码。此时,我能够计算光线参数(每个像素的世界位置和方向矢量值),但是我不知道当光线撞击表面时如何计算数据。

提前致谢。非常欢迎任何帮助。

顶点着色器:

#version 130

uniform mat4 osg_ViewMatrixInverse;

out vec3 positionEyeSpace;
out vec3 normalEyeSpace;
uniform vec3 cameraPos;

// ray definition, with an origin point and a direction vector
struct Ray {
    vec3 origin;
    vec3 direction;
};

void main() {
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

    // world space
    mat4 modelWorld = osg_ViewMatrixInverse * gl_ModelViewMatrix;
    vec3 positionWorldSpace = vec3(modelWorld * gl_Vertex);
    vec3 normalWorldSpace = mat3(modelWorld) * gl_Normal;

    // eye space
    positionEyeSpace = vec3(gl_ModelViewMatrix * gl_Vertex);
    normalEyeSpace = gl_NormalMatrix * gl_Normal;

    // calculate the reflection direction for an incident vector
    vec3 I = normalize(positionWorldSpace - cameraPos);
    vec3 N = normalize(normalWorldSpace);
    vec3 reflectedDirection = normalize(reflect(I, N));
}

片段着色器:

#version 130

in vec3 positionEyeSpace;
in vec3 normalEyeSpace;

uniform float farPlane;
uniform bool drawNormal;
uniform bool drawDepth;

out vec4 out_data;

void main() {
    vec3 nNormalEyeSpace = normalize(normalEyeSpace);

    vec3 nPositionEyeSpace = normalize(-positionEyeSpace);

    float linearDepth = sqrt(positionEyeSpace.x * positionEyeSpace.x +
                             positionEyeSpace.y * positionEyeSpace.y +
                             positionEyeSpace.z * positionEyeSpace.z);

    linearDepth = linearDepth / farPlane;

    // output the normal and depth data as matrix
    out_data = vec4(0, 0, 0, 1);
    if (linearDepth <= 1) {
        if (drawNormal) out_data.z = abs(dot(nPositionEyeSpace, nNormalEyeSpace));
        if (drawDepth)  out_data.y = linearDepth;
    }

    gl_FragDepth = linearDepth;
}
glsl raytracing rasterizing acoustics
1个回答
0
投票

您可以在此处找到在计算着色中编写光线追踪器的模板在此处输入链接描述

要进一步扩展它,您可以按照此操作在此处输入链接描述

虽然它是在 OpenCL 中,但它不是您可以使用 BRDF 实现来跟踪光线的非递归方式。将 OpenCL 移植到 Glsl 计算着色器相当容易。 希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.