1

Android SDK に付属の API デモから三角形レンダラーをコピーし、シェーダーを独自の raymarcher に置き換えました。しかし、私は赤の色にのみ影響を与えているように見える、これまでで最も気が遠くなるようなグリッチを得ています.

ここに私のシェーダーがあります:

private final String fs =
"  precision mediump float;\n"+
  "uniform float t;\n"+
  "varying vec2 vtex;\n"+
  "mat3 genRotMat(float a0,float x,float y,float z){\n"+
  "  float a=a0*3.1415926535897932384626433832795/180.0;\n"+
  "  return mat3(\n"+
  "    1.0+(1.0-cos(a))*(x*x-1.0),\n"+
  "    -z*sin(a)+(1.0-cos(a))*x*y,\n"+
  "    y*sin(a)+(1.0-cos(a))*x*z,\n"+
  "    z*sin(a)+(1.0-cos(a))*x*y,\n"+
  "    1.0+(1.0-cos(a))*(y*y-1.0),\n"+
  "    -x*sin(a)+(1.0-cos(a))*y*z,\n"+
  "    -y*sin(a)+(1.0-cos(a))*x*z,\n"+
  "    x*sin(a)+(1.0-cos(a))*y*z,\n"+
  "    1.0+(1.0-cos(a))*(z*z-1.0)\n"+
  "  );\n"+
  "}\n"+
  "float cubeDist(vec3 p){\n"+
  "  float t0 = 0.5;\n"+
  "  float t1 = 0.6;\n"+
  "  float max = max(abs(p.x),max(abs(p.y),abs(p.z)));\n"+
  "  if(max > t1) return 0.0;\n"+
  "  else if(max > t0) return (t1-max)/(t1-t0);\n"+
  "  else return 1.0;\n"+
  "};\n"+
  "void main() {\n"+
  "  float spread = 1.0;\n"+
  "  float val=0.0;\n"+
  "  float delta="+delta+";\n"+
  "  float cameraz="+cameraz+";\n"+
  "  float nearz="+nearz+";\n"+
  "  float farz="+farz+";\n"+
  "  float r=0.0,g=0.0,b=0.0;"+
  "  vec3 ray=vec3(0.0,0.0,0.0);\n"+
  "  mat3 rot=genRotMat(sin(t/3.13)*360.0,1.0,0.0,0.0);\n"+
  "  rot=rot*genRotMat(sin(t/3.64)*360.0,0.0,1.0,0.0);\n"+
  "  rot=rot*genRotMat(sin(t/3.24)*360.0,0.0,0.0,1.0);\n"+
  "  ray.z=nearz;\n"+
  "  ray.xy+=vtex.xy*spread*(nearz-cameraz);\n"+
  "  for(int i=0;i<"+iterations+";i++){\n"+
  "    vec3 temp;\n"+
  "    ray.xy+=vtex.xy*spread*delta;\n"+
  "    temp=ray*rot;\n"+
  "    val+=cubeDist(temp);\n"+
  "    r+=abs(temp.x*delta*delta*val);\n"+
  "    g+=abs(temp.y*delta*delta*val);\n"+
  "    b+=abs(temp.z*delta*delta*val);\n"+
  "    ray.z+=delta;\n"+
  "  }\n"+
  "  gl_FragColor=vec4(r,g,b,1.0);\n"+
  "}\n";

ここにグリッチの画像があります: http://imgur.com/2zcps.png

ファイル全体はこちら: http://pastebin.com/JF7rnSdE

4

1 に答える 1

1

考えてみると、これはコーディングの問題ではなく、nvidia ハードウェア/ドライバー側の完全に未知で奇妙なグリッチです。

変化:

  "    r+=abs(temp.x*delta*delta*val);\n"+
  "    g+=abs(temp.y*delta*delta*val);\n"+
  "    b+=abs(temp.z*delta*delta*val);\n"+

に:

  "    g+=abs(temp.y*delta*delta*val);\n"+
  "    r+=abs(temp.x*delta*delta*val);\n"+
  "    b+=abs(temp.z*delta*delta*val);\n"+

まったく未知の理由で問題を解決します。また、for ループの繰り返しの長さを変更すると、このグリッチにも影響するようです。おそらく、for ループの展開が原因です。

于 2012-09-29T19:35:43.253 に答える