是否可以在没有矩阵的情况下在 OpenGL ES 中使用纹理?

Is it possible to use a texture in OpenGL ES withouth a matrix?

我正在学习 OpenGL ES 并为此使用 Mehta 写的书 "Lean OpenGL ES for Mobile Game and Graphics Development"。他首先展示了如何构建一个简单的项目,接着添加了 orthoMatrix,然后是 3D,最后他解释了如何将这一切与纹理一起使用。我想知道是否可以使用没有矩阵的纹理。我必须说我试过了,程序没有崩溃,但纹理完全分散和混乱 - 好像 vertexData 是错误的。所以我的第一个问题是理论上是否可行?

更新 1

下面的代码代表了一个能够在纹理上显示相机预览的应用程序。使用矩阵可以正常工作,但不使用矩阵会出现如图所示的屏幕。

这是纹理顶点着色器和纹理片段着色器


attribute vec4 a_Position;
attribute vec2 a_TextureCoordinates;
varying vec2 v_TextureCoordinates;
void main()
{
v_TextureCoordinates = a_TextureCoordinates;
gl_Position = a_Position;
}


#extension GL_OES_EGL_image_external : require
precision mediump float;
uniform samplerExternalOES u_TextureUnit;
varying vec2 v_TextureCoordinates;
void main()
{
gl_FragColor = texture2D(u_TextureUnit, v_TextureCoordinates);
}

纹理加载器


public class TextureHelper {


    public static final int GL_TEXTURE_EXTERNAL_OES = 0x8D65;

    public static int loadTexture() {
        final int[] textureObjectsId = new int[1];
        GLES20.glGenTextures(1, textureObjectsId, 0);

        if (textureObjectsId[0] == 0 ) {
            return 0;
        }

        GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, textureObjectsId[0]);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
        GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, 0);

        return textureObjectsId[0];

地点和制服



public class TextureShaderProgram extends ShaderProgram {

    private final int uTextureUnitLocation;
    // Attribute locations
    private final int aPositionLocation;
    private final int aTextureCoordinatesLocation;



    public TextureShaderProgram(Context context) {
        super(context, R.raw.texture_vertex_shader, R.raw.texture_fragment_shader);

        uTextureUnitLocation = GLES20.glGetUniformLocation(program, U_TEXTURE_UNIT);

        aPositionLocation = GLES20.glGetAttribLocation(program, A_POSITION);

        aTextureCoordinatesLocation = GLES20.glGetAttribLocation(program, A_TEXTURE_COORDINATES);
    }


    public void setUniforms(int textureId) {
        GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
        GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, textureId);
        GLES20.glUniform1i(uTextureUnitLocation, 0);
    }

    public int getPositionAttributeLocation() {
        return aPositionLocation;
    }
    public int getTextureCoordinatesAttributeLocation() {
        return aTextureCoordinatesLocation;
    }

}

vertexData(三角形扇形)



public class Table {

    private static final int POSITION_COMPONENT_COUNT = 2;
    private static final int TEXTURE_COORDINATES_COMPONENT_COUNT = 2;
    private static final int STRIDE = (POSITION_COMPONENT_COUNT + TEXTURE_COORDINATES_COMPONENT_COUNT * BYTES_PER_FLOAT);

    private static final float[] VERTEXDATA = {


            0f, 0f,         0.5f, 0.5f, //middle
            -0.5f, -0.8f,    1f, 0.1f,//bottom left
            0.5f, -0.8f,    1f, 0.9f, //bottom right
            0.5f, 0.8f,     0f, 0.9f,//top right
            -0.5f, 0.8f,    0f, 0.1f, // top left
            -0.5f, -0.8f,   1f, 0.1f, // bottom left

    };

您还需要更多吗?留下评论,以便我可以 post 剩下的,如果需要的话。

您通常需要某种形式的变换来为场景中的顶点设置动画。这几乎总是一个矩阵,因为它们可以有效地表示任何所需的变换,但不一定是。

纹理坐标本身很少被矩阵修改 - 通常纹理在模型上 "fixed" 因此坐标直接通过顶点着色器而不进行修改。