シェーダーに入るすべての頂点で 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つの質問があります:
このコンセプトは可能ですか?
変換が正しくありませんよね?float から float に変換する場合、変換はビットの順序を保持するのではなく、そのデータ型で表す値を保持すると思いますよね?
現在、次のコマンドを実行すると、シェーダーから -1 が返されます: glGetAttribLocation(mShaderHandle, "fColor"); しかし、これは 1 行前に機能します: glGetAttribLocation(mShaderHandle, "vPosition");
それで、何かアイデアはありますか?
前もって感謝します!