如何在不使用glViewPort的情况下在opengl上具有固定坐标系

问题描述

我目前正在学习适用于Android的Opengl ES。 我读过许多教程,其中说的坐标系是从-1f -1f(左下角)到1f 1f右上角。 我能找出的那么多。但是我目前正在尝试的问题是尝试调整三角形大小时:窗口似乎正在根据极值调整自身大小。如果这是我尝试绘制的唯一三角形,则在两个不同的实例上,
0f,0f,
0f,0.01f,
0.01f,0.01f
三角形与
完全相同 0f,0f
0f,1f
1f,1f
老实说我在这里迷路了。有我的代码: int vertexShaderID,fragmentShaderID;

    int[] result = new int[1];
    _vertexSize = 2;
    _verticeCount = 3;
    _context = context;
    vertexShaderID = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
    fragmentShaderID = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
    GLES20.glShaderSource(vertexShaderID,_context.getString(R.string.vertexShader));
    GLES20.glShaderSource(fragmentShaderID,_context.getString(R.string.fragmentShader));
    _programID = GLES20.glCreateProgram();
    GLES20.glCompileShader(vertexShaderID);
    GLES20.glGetShaderiv(vertexShaderID,GLES20.GL_COMPILE_STATUS,result,0);
    GLES20.glCompileShader(fragmentShaderID);
    GLES20.glGetShaderiv(fragmentShaderID,0);
    GLES20.glAttachShader(_programID,vertexShaderID);
    GLES20.glAttachShader(_programID,fragmentShaderID);
    GLES20.glLinkProgram(_programID);
    GLES20.glGetProgramiv(_programID,GLES20.GL_LINK_STATUS,0);
    GLES20.glValidateProgram(_programID);

    GLES20.glGenBuffers(1,0);
    vertexBufferID = result[0];
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER,vertexBufferID);
    FloatBuffer coordBuffer = FloatBuffer.allocate(_vertexSize * _verticeCount);
    coordBuffer.put(coords);
    coordBuffer.position(0);
    Log.d("count","" + SIZEOF_FLOAT * _verticeCount * _vertexSize);
    GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER,SIZEOF_FLOAT * _verticeCount * _vertexSize,coordBuffer,GLES20.GL_DYNAMIC_DRAW);

    coordBuffer.clear();
    GLES20.glEnabLevertexAttribArray(0);
    GLES20.glVertexAttribPointer(0,2,GLES20.GL_FLOAT,true,2 * SIZEOF_FLOAT,0);
    Log.d("version",GLES20.glGetString(GLES20.GL_VERSION));

我也试图替换 GLES20.glVertexAttribPointer(0,0);的{​​{1}},
预先感谢您的帮助
P.-S:有我的着色器GLES20.glVertexAttribPointer(0,false,0);

解决方法

发现我犯的错误:我的着色器错误。 gl_position的depth参数设置为0,所以我想无论如何它都会在屏幕之外。如果gl_Position.xy = inPosition;,则GLES20.glVertexAttribPointer(0,2,GLES20.GL_FLOAT,false,2 * SIZEOF_FLOAT,0);可以正常工作。如果第4个参数为true,它将对其进行重新缩放。