2

シェーダーに入るすべての頂点で 1 つの色を送信しようとしていますが、float 値は 1 つだけです。すべての頂点で属性として 4 バイトを送信できないのは奇妙だと思いますが、RGBA を単一の float 変数にパックしようとするのは不可能なので、これが私のコードです。

Jave コード (値を 1 つの float にパックする):

private float fourfColor2One(float r, float g, float b, float a)
{
    long temp = (byte) (r * 255);
    float res = temp << 24;

    temp = (byte) (g * 255);
    res += temp << 16;

    temp = (byte) (b * 255);
    res += temp << 8;

    temp = (byte) (a * 255);
    res += temp;

    return res;
}

シェーダーコード (それをまとめたもの): 頂点シェーダー:

attribute vec4 vPosition;
attribute float fColor;
uniform vec2 vCamPos;
uniform float fZoom;
uniform mat4 m_projectionMat;
varying float v_Color;
void main() {
  vec4 position = vec4(vPosition.x - vCamPos.x - 16., vPosition.y - vCamPos.y - ((32. / "+ GraphicsRenderer.mScnR +") / 2.), -1., 1.);
  position = position * m_projectionMat;
  gl_Position = vec4(position.xy * fZoom, -1, 1);
  v_Color = fColor;
}

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

precision mediump float;
varying float v_Color;
void main() {
   uint temp = uint(v_Color);
   float r = temp & 0xf000;
   float g = temp & 0x0f00;
   float b = temp & 0x00f0;
   float a = temp & 0x000f;
    gl_FragColor = vec4(r, g, b, a);
}

だから私は3つの質問があります:

  1. このコンセプトは可能ですか?

  2. 変換が正しくありませんよね?float から float に変換する場合、変換はビットの順序を保持するのではなく、そのデータ型で表す値を保持すると思いますよね?

  3. 現在、次のコマンドを実行すると、シェーダーから -1 が返されます: glGetAttribLocation(mShaderHandle, "fColor"); しかし、これは 1 行前に機能します: glGetAttribLocation(mShaderHandle, "vPosition");

それで、何かアイデアはありますか?

前もって感謝します!

4

1 に答える 1

2

私は変換します

private static int fourfColor2One(float r, float g, float b, float a) {
    return (Math.round(r * 255) << 24) + 
           (Math.round(g * 255) << 16) +
           (Math.round(b * 255) << 8) +
           Math.round(a * 255);
}

これは、スケールが「シェーダー」で 0.0 から 1.0 であると仮定し、スケールが 0.0 から 255.0 であると仮定します


これを逆にするための「疑似コード」

float r = (temp & 0xf000)/255.0;
float g = (temp & 0x0f00)/255.0;
float b = (temp & 0x00f0)/255.0;
float a = (temp & 0x000f)/255.0;
于 2012-09-20T15:38:47.140 に答える