1

ios opengl es 2.0(ipad)でシンプルなテクスチャスプラッティングを試しています。pvrt圧縮アトラス(2x2タイル)に4つのタイルテクスチャがあります。4つのテクスチャユニット上の4つの単一テクスチャは非常に低速でした。

頂点シェーダー:

attribute lowp vec4 position;
attribute lowp vec2 tex0;
varying lowp vec2 surfCoord;
uniform mat4 projection_modelview;
uniform lowp float uv_coef;

varying lowp vec2 texCoord1;
varying lowp vec2 texCoord2;
varying lowp vec2 texCoord3;
varying lowp vec2 texCoord4;

void main()
{
  gl_Position = projection_modelview * position;
  vec2 texCoord = fract(vec2(position.x / uv_coef, position.y / uv_coef));
  texCoord1 = texCoord * 0.5;
  texCoord2 = texCoord1 + vec2(0.5, 0);
  texCoord3 = texCoord1 + vec2(0, 0.5);
  texCoord4 = texCoord1 + vec2(0.5, 0.5);
  surfCoord = tex0;
}

フラグメントシェーダー:

uniform sampler2D texture0;    // surface alpha map
uniform sampler2D texture1;    // atlas
varying lowp vec2 surfCoord;
varying lowp vec2 texCoord1;
varying lowp vec2 texCoord2;
varying lowp vec2 texCoord3;
varying lowp vec2 texCoord4;

void main()
{
  lowp vec4 surfTexel = texture2D(texture0, surfCoord);
  lowp vec4 texel1 = texture2D(texture1, texCoord1);
  lowp vec4 texel2 = texture2D(texture1, texCoord2);
  lowp vec4 texel3 = texture2D(texture1, texCoord3);
  lowp vec4 texel4 = texture2D(texture1, texCoord4);

  texel1 *= surfTexel.r;
  texel2 = mix(texel1, texel2, surfTexel.g);
  texel3 = mix(texel2, texel3, surfTexel.b);
  gl_FragColor = mix(texel3, texel4, surfTexel.a);
}

これを示しています:

表面
(出典:inputwish.com

私の問題はおそらくテクスチャユニット補間器ですが、解決する方法がありません。シェーダーに間違いはありません。何かアドバイスはありますか?

4

1 に答える 1

0

間違いは、頂点シェーダーでフラクトを使用することです。早すぎ。フラグメントシェーダーに含める必要があります。

lowp vec4 texel1 = texture2D(texture1, fract(texCoord) * 0.5);
lowp vec4 texel2 = texture2D(texture1, fract(texCoord) * 0.5 + vec2(0.5, 0.0));
lowp vec4 texel3 = texture2D(texture1, fract(texCoord) * 0.5 + vec2(0.0, 0.5));
lowp vec4 texel4 = texture2D(texture1, fract(texCoord) * 0.5 + vec2(0.5, 0.5));
... and mix them together..

とにかく、依存するテクスチャがipad iosで読み取るため、低速です。

于 2013-01-24T16:16:12.640 に答える