OpenGL ES 2.0を使用してJava(Android)でスプライト(テクスチャ付き矩形)クラスを構築しています。OpenGL ES 2.0で行列乗算(頂点シェーダで)を使ったベクトル変換が動作しない
私の目標は、テクスチャのセクションのみを使用することです。したがって、マトリックスを頂点シェーダに渡します。次の例では、私は唯一のテクスチャの右半分を見てみたいと思います(私は左半分をseingよ)、フルスプライト幅にわたってスケール:
/ 0.5, 0, 0, 0.5 \ /x \ /0.5 * x + 0.5 \
| 0 , 1, 0, 0 | \/ | y | --- | y |
| 0 , 0, 1, 0 | /\ | 1 | --- | 1 |
\ 0 , 0, 0, 1 / \ 1/ \ 1 /
私は私のテクスチャ座標に入れた場合は、それを(紙に)だけで正常に動作:
(0,1) -> (0.5,1) // bottom left
(1,1) -> (1, 1) // bottom right
(0,0) -> (0.5,0) // top left
(1,0) -> (1, 0) // top right
しかし、現実には、私はこれらの結果を得る:
(0,1) -> (0 ,1)
(1,1) -> (0.5,1)
(0,0) -> (0 ,0)
(1,0) -> (0.5,0)
スケーリング一部が動作することを意味するが、翻訳部分はありません。
コード:
バーテックスシェーダ:
attribute vec4 position;
attribute vec2 texturePosition;
uniform mat4 mvpMatrix;
uniform mat4 textureMatrix;
varying vec2 iTexturePosition;
void main() {
gl_Position = mvpMatrix * position;
vec4 tp = vec4(texturePosition.x, texturePosition.y, 1, 1);
tp = textureMatrix * tp;
//tp[0] += 0.5;
iTexturePosition = tp.xy;
}
フラグメントシェーダ:
precision mediump float;
uniform sampler2D textureUnit;
varying vec2 iTexturePosition;
void main() {
vec4 color = texture2D(textureUnit, iTexturePosition);
if (color.a <= 0.25) {
discard;
}
if (iTexturePosition[0] <= 0.4) {
//discard;
}
gl_FragColor = color;
}
のJava側:
private static int textureMatrixHandle = -1;
private static final String textureMatrixName = "textureMatrix";
private float[] textureMatrix = new float[16];
// more code ...
@Override
public void draw { // only relevant lines
textureMatrixHandle = GLES20.glGetUniformLocation(glProgram, textureMatrixName);
Matrix.setIdentityM(textureMatrix, 0);
setTextureSection(textureMatrix, 0, 0.5f, 1, 1, 0);
GLES20.glUniformMatrix4fv(textureMatrixHandle, 1, false, textureMatrix, 0);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, VERTEX_COUNT);
}
protected void translateTextureSection(float[] textureMatrix, float x, float y) {
Matrix.multiplyMM(textureMatrix, 0, new float[] {
1, 0, 0, x,
0, 1, 0, y,
0, 0, 1, 0,
0, 0, 0, 1,
}, 0, textureMatrix, 0);
}
protected void scaleTextureSection(float[] textureMatrix, float x, float y) {
Matrix.multiplyMM(textureMatrix, 0, new float[] {
x, 0, 0, 0,
0, y, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1,
}, 0, textureMatrix, 0);
}
protected void rotateTextureSection(float[] textureMatrix, float angle) {
angle = (float) Math.toRadians(angle);
float sin = (float) Math.sin(angle);
float cos = (float) Math.cos(angle);
Matrix.multiplyMM(textureMatrix, 0, new float[] {
cos, -sin, 0, 0,
sin, cos, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1,
}, 0, textureMatrix, 0);
}
protected void setTextureSection(float[] textureMatrix, float rotationAngle, float left, float right, float bottom, float top) {
rotateTextureSection(textureMatrix, rotationAngle);
translateTextureSection(textureMatrix, left, top);
scaleTextureSection(textureMatrix, right - left, bottom - top);
}
glUniformMatrixf4v(またはそれが何であれ)を呼び出すときに、transposeフラグにtrueまたはfalseを渡していますか? – samgak
私はfalseを渡しています。 (私はテクスチャの全体の高さと幅の半分を見ています、それは幅のちょうど間違った半分です) – EvilDevil
@samgak私はこのような制服を設定しています:GLES20.glUniformMatrix4fv textureMatrixHandle、1、false、textureMatrix、0); – EvilDevil