光線類型
GLSL中的默認光線有以下隱式的內置變量:
raytypeIMG {
highp vec3 gl_OriginIMG;
highp vec3 gl_DirectionIMG;
highp rayprogramIMG gl_PrefixRayProgramIMG;
lowp uint gl_SceneIMG;
highp float gl_MaxDistanceIMG;
mediump ivec2 gl_PixelIMG;
mediump uint gl_BounceCountIMG;
bool gl_IsOutgoingIMG;
bool gl_FlipFacingIMG;
bool gl_RunPrefixProgramIMG;
};
通過添加用戶自定義變量界定默認光線的類型。例如,陰影光線如下所示:
layout(binding = 0, occlusion_test_always) raytypeIMG ShadowRay {
vec3 colour;
};
調用glSceneArrayRayBlockSizeIMG,可以界定使用的每個光線類型。調用glGetComponentProgramHandleIMG,可以界定每個組件集應該執行的頂點和光線著色器。創建一個像標準頂點或片段著色器一樣的光線著色器。
幀著色器
流程的第一部分便是幀著色器。幀著色器是glsl著色器,根據glDispatchRaysIMG中參數請求的寬度x高度,可以發送零條或多條光線到場景中。注意,不需要通過當前幀著色器中的坐標來積累光線位置,即光線與像素位置不耦合。
layout (rgba8, binding = 0) uniform accumulateonly highp image2D rayTraceDiffuseImage;
layout(max_rays = 1) out;
out ShadowRay shadowRay;
uniform rayprogramIMG defaultRayProgram;
void emitShadowRay(highp vec3 p, highp vec3 normal, highp vec3 dir, highp float maxDistance, vec3 colour) {
shadowRay.gl_OriginIMG = p + depthModifier*normal;
shadowRay.gl_DirectionIMG = dir;
shadowRay.gl_PrefixRayProgramIMG = gl_NullRayProgramIMG;
shadowRay.gl_SceneIMG = uint(gl_DispatchRaysIDIMG);
shadowRay.gl_MaxDistanceIMG = maxDistance;
shadowRay.gl_PixelIMG = gl_FrameCoordIMG;
shadowRay.gl_BounceCountIMG = 0u;
shadowRay.gl_IsOutgoingIMG = true;
shadowRay.gl_FlipFacingIMG = false;
shadowRay.gl_RunPrefixProgramIMG = false;
shadowRay.colour = colour;
emitRayIMG(shadowRay, defaultRayProgram);
}
void main() {
emitShadowRay(vPosition, unpackedNormal, vNormalisedDirectionToLight, length(vDirectionToLight), vec3(1.0,0.0,0.0));
imageAddIMG(rayTraceDiffuseImage, gl_FrameCoordIMG, vec4(0.0,0.0,1.0,0.0));
}
可以看到,幀著色器有一些額外的添加至GLSL中。內置的命令是:
gl_DispatchRaysIDIMG 是輸入glDispatchRaysIMG的第一個參數,用于多緩沖。
gl_FrameCoordIMG是目前幀著色器中的坐標。
gl_NullRayProgramIMG是無操作程序,用于比較rayprogramIMGs。
陰影光線具有可用的隱式光線類變量,如上所示,且每個變量在流程中執行某個函數。在幀著色器中,這些變量通常是可編輯而非可讀取。
gl_OriginIMG是發送光線的源頭。
gl_DirectionIMG是光線發送的方向。
gl_PrefixRayProgramIMG是運行交叉光線著色器之前可運行的前綴光線方案。
gl_SceneIMG是發送光線的場景id.(如上述glBindSceneArrayComponentGroupIMG中指定的參數)
gl_MaxDistanceIMG是光線所能追蹤的最大距離,這里不考慮交叉,且運行defaultRayProgram。
gl_PixelIMG是光線發送的原始像素。
gl_BounceCountIMG是光線當前的反射數。(在幀著色器中通常為0)
gl_IsOutgoingIMG即光線向外延伸——詳細信息在下一篇文章中討論。
gl_FlipFacingIMG即是否在下次交叉中翻轉表面以再次測試光線。
gl_RunPrefixProgramIMG即是否運行上述的前綴方案。
emitRayIMG是發送光線且將光線傳輸至交叉測試硬件的GLSL函數,而imageAddIMG是下文即將討論的累積函數。
shadeRayIMG也可用。該函數可以在給定的光線方案內對光線著色,且不需要進行交叉測試。
光線著色器
當光線與三角形交叉、光線到達最大距離或想要運行前綴方案時,則啟動光線著色器。在幀著色器中,我們僅編寫光線變量;而在光線著色器中,我們可以讀取光線變量,且發送更多光線時還可以編寫光線變量。
layout(binding=0, occlusion_test_always) raytypeIMG ShadowRay {
highp vec3 diffuseObjectColor;
highp vec3 ambientObjectColor;
};
layout(binding=1, occlusion_test_never) raytypeIMG ReflectiveRay {
highp vec3 reflectiveColor;
};
layout(rgba8, binding=2) uniform accumulateonly highp image2D reflectionOutput;
in perVertexData {
highp vec3 vertexNormal;
highp vec2 vertexTexCoord;
} vertexData[];
rayInputHandlerIMG(ShadowRay inputRay) {
void main() {
imageAddIMG(reflectionOutput, inputRay.gl_PixelIMG, vec4(inputRay.ambientObjectColor, 0.0));
}
}
rayInputHandlerIMG(ReflectiveRay inputRay) {
layout(max_rays=2) out;
out ShadowRay reflectedShadowRay;
out ReflectiveRay reflectionRay;
評論
查看更多