#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, он изменит его масштаб.