Matrix 在OpenGL ES中不使用矩阵就可以使用纹理吗?

Matrix 在OpenGL ES中不使用矩阵就可以使用纹理吗?,matrix,opengl-es,textures,opengl-es-2.0,Matrix,Opengl Es,Textures,Opengl Es 2.0,我正在学习OpenGL ES并使用Mehta编写的《移动游戏和图形开发的精益OpenGL ES》一书。他首先展示了如何构建一个简单的项目,然后添加了正交矩阵,然后是3D,最后他解释了如何将这一切与纹理一起使用。我想知道是否可以使用没有矩阵的纹理。我必须说,我试过了,程序没有崩溃,但纹理完全分散和无序-好像顶点数据是错误的。所以我的第一个问题是,这在理论上是否可能 更新1 下面的代码表示能够在纹理上显示摄影机预览的应用程序。使用矩阵可以很好地工作,但如果不使用矩阵,屏幕会显示如图所示 这是纹理顶点

我正在学习OpenGL ES并使用Mehta编写的《移动游戏和图形开发的精益OpenGL ES》一书。他首先展示了如何构建一个简单的项目,然后添加了正交矩阵,然后是3D,最后他解释了如何将这一切与纹理一起使用。我想知道是否可以使用没有矩阵的纹理。我必须说,我试过了,程序没有崩溃,但纹理完全分散和无序-好像顶点数据是错误的。所以我的第一个问题是,这在理论上是否可能

更新1

下面的代码表示能够在纹理上显示摄影机预览的应用程序。使用矩阵可以很好地工作,但如果不使用矩阵,屏幕会显示如图所示

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


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

纹理加载程序


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;
    }

}

顶点数据(三角形风扇)


你还需要更多吗?请留下评论,以便我可以在需要时发布其余内容。

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


纹理坐标本身很少被矩阵修改-通常纹理在模型上是“固定”的,因此坐标只通过顶点着色器而不进行修改

好吧,理论上这是可能的。关于如何使用它,你有现成的例子吗?因为在我的项目中,除了纹理部分,我把所有的东西都省略了,正如我所说的,纹理矩形看起来完全变形了。有什么不同和特殊的方法来做吗?查看我的更新,也许他们会清除更多请上传屏幕截图,说明您在屏幕上看到了什么,以及如何在应用程序中设置代码。着色器不太可能是这里的问题。请阅读
步幅
计算不正确。您需要将所有组件的浮点值之和乘以一个浮点值大小,但现在右括号的位置不正确,因此只会乘以纹理坐标组件计数。谢谢您的帮助。成功了!祝您今天过得愉快!!!


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;
    }

}



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

    };