GLSL简易光线追踪代码编译通过但输出全黑问题求解
GLSL简易光线追踪代码渲染全黑问题
我正在学习基于GLSL的简易光线追踪技术,参考了Inigo Quilez的教程。编写的代码编译无任何报错,但无法输出预期的球体渲染效果,最终输出图像完全为黑色,暂无法定位问题根源,寻求解决方案。
问题代码
#ifdef GL_ES precision highp float; #endif uniform vec3 unResolution; uniform float time; uniform sampler2D tex0; uniform sampler2D tex1; uniform sampler2D fft; uniform vec4 unPar; uniform vec4 unPos; uniform vec4 unBeatBassFFT; float iSphere( in vec3 ro, in vec3 rd, in vec4 sph ) { // 球心在原点的求交公式 // |ro|^2 + t^2 + 2<ro,rd>t - r^2 = 0 vec3 oc = ro - sph.xyz; float b = 2.0*dot( oc,rd ); float c = 2.0*dot( oc,oc ); float h = b*b - sph.w*sph.w; if ( h<0.0 ) return -1.0; float t = (-b - sqrt(h))/2.0; return t; } vec3 nSphere( in vec3 pos, in vec4 sph ) { return (pos-sph.xyz)/sph.w; } float iPlane( in vec3 ro, in vec3 rd ) { return -ro.y/rd.y; } vec3 nPlane( in vec3 pos ) { return vec3(0.0,1.0,0.0); } vec4 sph1 = vec4( 0.0, 1.0, 0.0, 1.0 ); float intersect( in vec3 ro, in vec3 rd, out float resT ) { resT = 1000.0; float id = -1.0; float tsph = iSphere( ro, rd, sph1 ); float tpla = iPlane( ro, rd ); if ( tsph>0.0 ) { id = 1.0; resT = tsph; } if (tpla>0.0 && tpla<resT) { id = 2.0; resT = tpla; } return id; } void main(void) { vec3 light = normalize( vec3( 0.57703 )); vec2 uv = (gl_FragCoord.xy/unResolution.xy)*vec2(1.78,1.0); //sph1.x = 0.5*cos(time); //sph1.z = 0.5*sin(time); vec3 ro = vec3( 0.0, 0.5, 3.0 ); vec3 rd = normalize( vec3( (-1.0+2.0+uv)*vec2(1.78,1.0), 1.0 ) ); float t; float id = intersect( ro, rd, t ); vec3 col = vec3(0.0); if( id>0.5 && id<1.5 ) { vec3 pos = ro + t*rd; vec3 nor = nSphere( pos, sph1 ); float dif = clamp(dot( nor, light ), 0.0, 1.0); float ao = 0.5 + 0.5*nor.y; float amb = 0.5 + 0.5*nor.y; col = vec3( 0.9, 0.8, 0.6 )*dif+amb*vec3(0.5,0.6,0.7); } else if( id>1.5 ) { vec3 pos = ro + t*rd; vec3 nor = nPlane( pos ); float dif = clamp( dot(nor, light), 0.0, 1.0 ); float amb = smoothstep( 0.0, 2.0*sph1.w, length(pos.xz-sph1.xz) ); col = vec3(amb*0.7); //col = vec3( 1.0, 0.0, 0.0 )*dif + amb*vec3(0.5,0.6,0.7); } col = sqrt(col); gl_FragColor = vec4(col,1.0); }
修复后可运行代码
目前球体的着色还未完全优化,但代码已经可以正常运行:
#ifdef GL_ES precision highp float; #endif uniform vec2 resolution; #define unResolution resolution uniform float time; uniform sampler2D tex0; uniform sampler2D tex1; uniform sampler2D fft; uniform vec4 unPar; uniform vec4 unPos; uniform vec4 unBeatBassFFT; float iSphere( in vec3 ro, in vec3 rd, in vec4 sph ) { // 球心在原点的求交公式 // |ro|^2 + t^2 + 2<ro,rd>t - r^2 = 0 vec3 oc = ro - sph.xyz; float b = 2.0*dot( oc,rd ); float c = 2.0*dot( oc,oc ); float h = b*b - sph.w*sph.w; if ( h<0.0 ) return -1.0; float t = (-b - sqrt(h))/2.0; return t; } vec3 nSphere( in vec3 pos, in vec4 sph ) { return (pos-sph.xyz)/sph.w; } float iPlane( in vec3 ro, in vec3 rd ) { return -ro.y/rd.y; } vec3 nPlane( in vec3 pos ) { return vec3(0.0,1.0,0.0); } vec4 sph1 = vec4( 0.0, 1.0, 0.0, 1.0 ); float intersect( in vec3 ro, in vec3 rd, out float resT ) { resT = 1000.0; float id = -1.0; float tsph = iSphere( ro, rd, sph1 ); float tpla = iPlane( ro, rd ); if ( tsph>0.0 ) { id = 1.0; resT = tsph; } if (tpla>0.0 && tpla<resT) { id = 2.0; resT = tpla; } return id; } void main(void) { vec3 light = normalize( vec3( 0.57703 )); vec2 uv = (gl_FragCoord.xy/unResolution.xy); vec2 p = uv * 2.0 - 1.0; p.x*=unResolution.x/unResolution.y; //sph1.x = 0.5*cos(time); //sph1.z = 0.5*sin(time); vec3 ro = vec3( 0.0, 1.0, -1.0 ); vec3 rd = normalize( vec3(p,0.2) ); float t; float id = intersect( ro, rd, t ); vec3 col = vec3(0.0); if( id>0.5 && id<1.5 ) { vec3 pos = ro + t*rd; vec3 nor = nSphere( pos, sph1 ); float dif = clamp(dot( nor, light ), 0.0, 1.0); float ao = 0.1 + 0.5*nor.y; float amb = 0.5 + 0.5*nor.y; col = vec3( 1.0, 0.0, 0.0 )*dif + amb*vec3(0.5,0.6,0.7); } else if( id>1.5 ) { vec3 pos = ro + t*rd; vec3 nor = nPlane( pos ); float dif = clamp( dot(nor, light), 0.5, 1.0 ); float amb = smoothstep( 0.5, 2.0*sph1.w, length(pos.xz-sph1.xz) ); col = vec3(amb*0.9); //col = vec3( 1.0, 0.0, 0.0 )*dif + amb*vec3(0.5,0.6,0.7); } col = sqrt(col); gl_FragColor = vec4(col,1.0); }
内容的提问来源于stack exchange,提问作者user7428090
相关产品推荐
相关产品推荐

