как иметь фиксированную систему координат в opengl без использования glViewport

#java #opengl-es #shader #opengl-es-2.0 #scaling

#java #opengl-es #шейдер #opengl-es-2.0 #масштабирование

Вопрос:

В настоящее время я изучаю Opengl ES для Android. Я прочитал много руководств, в которых говорится, что система координат находится от -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, GLES20.GL_COMPILE_STATUS, result,0);
    GLES20.glAttachShader(_programID, vertexShaderID);
    GLES20.glAttachShader(_programID, fragmentShaderID);
    GLES20.glLinkProgram(_programID);
    GLES20.glGetProgramiv(_programID, GLES20.GL_LINK_STATUS, result, 0);
    GLES20.glValidateProgram(_programID);

    GLES20.glGenBuffers(1,result,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,2,GLES20.GL_FLOAT, true,2 * SIZEOF_FLOAT,0); с помощью GLES20.glVertexAttribPointer(0,2,GLES20.GL_FLOAT, false,2 * SIZEOF_FLOAT,0);
заранее благодарю вас за помощь
P.-S: вот мой шейдер attribute highp vec2 inPosition; void main() { gl_Position = vec4(inPosition.x, inPosition.y,0.0,0.0) ; }

Ответ №1:

обнаружил ошибку, которую я допустил: мой шейдер был неправильным. параметр глубины gl_position был установлен в 0, поэтому я предполагаю, что он выходил за пределы экрана, несмотря ни на что. gl_Position.xy = inPosition; работает просто отлично, если GLES20.glVertexAttribPointer(0,2,GLES20.GL_FLOAT, false,2 * SIZEOF_FLOAT,0); . Если 4-й параметр имеет значение true, он изменит его масштаб.