[英]how to have a fixed coordinate system on opengl without using glViewPort
我目前正在为 android 学习 Opengl ES。 我读过很多教程,说坐标系是从 -1f -1f(左下角)到 1f 1f 右上角。 我能弄清楚的就这么多了。 但是我目前正在尝试的问题是,当我尝试调整三角形的大小时:window 似乎正在根据我的极值调整自身的大小。 如果这是我尝试在两个不同实例上绘制的唯一三角形,则
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); }
attribute highp vec2 inPosition; void main() { gl_Position = vec4(inPosition.x, inPosition.y,0.0,0.0); }
发现我犯的错误:我的着色器错了。 gl_position 的深度参数设置为 0,所以我猜无论如何它都会超出屏幕。 gl_Position.xy = inPosition;
如果GLES20.glVertexAttribPointer(0,2,GLES20.GL_FLOAT, false,2 * SIZEOF_FLOAT,0);
工作得很好 . 如果第四个参数为真,它将重新调整它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.