繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM