Android 使用OpenGL ES 2.0渲染多个像素

Android 使用OpenGL ES 2.0渲染多个像素,android,opengl-es-2.0,vertex-array,Android,Opengl Es 2.0,Vertex Array,从一开始讲,我对OpenGL世界非常熟悉,但我需要在Android中使用它进行一些渲染优化。我必须使用OpenGL ES 2.0在2D空间中渲染一个块或一组连续像素。然而,我已经找到了一些合适的解决方案,并且两种方法我都试过了,但是我无法达到预期的结果 第一件事是像素总是在原点(中心或{0,0}),我不能从那里移动它。我更愿意把它放在屏幕的左上角 第二件事是我不能画多个像素。我想产生多个像素,而不仅仅是一个 总而言之:我只想连续放置像素,例如:第一个像素从左上角开始,第二个像素应该紧跟在X轴上第

从一开始讲,我对OpenGL世界非常熟悉,但我需要在Android中使用它进行一些渲染优化。我必须使用OpenGL ES 2.0在2D空间中渲染一个块或一组连续像素。然而,我已经找到了一些合适的解决方案,并且两种方法我都试过了,但是我无法达到预期的结果

第一件事是像素总是在原点(中心或{0,0}),我不能从那里移动它。我更愿意把它放在屏幕的左上角

第二件事是我不能画多个像素。我想产生多个像素,而不仅仅是一个

总而言之:我只想连续放置像素,例如:第一个像素从左上角开始,第二个像素应该紧跟在X轴上第一个像素之后,依此类推。当满足屏幕的结束边距时,新像素应在新行(Y+1)上开始

我使用的代码是:

package point.example.point;
导入android.opengl.GLES20;
导入android.opengl.GLSurfaceView;
导入android.opengl.Matrix;
导入java.nio.ByteBuffer;
导入java.nio.ByteOrder;
导入java.nio.FloatBuffer;
导入javax.microedition.khronos.egl.EGLConfig;
导入javax.microedition.khronos.opengles.GL10;
公共类PointRenderer实现GLSurfaceView.Renderer{
私有浮点[]mModelMatrix=新浮点[16];
私有浮点[]mViewMatrix=新浮点[16];
私有浮动[]mProjectionMatrix=新浮动[16];
私有浮点[]mMVPMatrix=新浮点[16];
私有int mMVPMatrixHandle;
私有int-mPositionHandle;
浮点[]顶点={
0.0f,0.0f,0.0f
};
浮动缓冲区顶点buf;
@凌驾
已创建表面上的公共void(GL10 glUnused,EGLConfig配置){
vertexBuf=ByteBuffer.allocateDirect(顶点.length*4).order(ByteOrder.nativeOrder()).asFloatBuffer();
顶点位置(0);
//将背景清除颜色设置为黑色。
GLES20.glClearColor(0f、0f、0f、1f);
浮眼x=0.0f;
浮眼Y=0.0f;
浮眼z=0.0f;
浮动中心X=0.0f;
浮动中心Y=0.0f;
浮动中心Z=-5.0f;
浮点数upX=0.0f;
浮球upY=1.0f;
浮动upZ=0.0f;
//设置视图矩阵。该矩阵可以表示摄像机的位置。
//注意:在OpenGL 1中,使用了ModelView矩阵,它是模型和
//在OpenGL 2中,如果我们愿意,我们可以单独跟踪这些矩阵。
矩阵.setLookAtM(mViewMatrix,0,eyeX,eyeY,eyeZ,centerX,centerY,centerZ,upX,upY,upZ);
最终字符串顶点着色器=
“统一mat4 u\u MVP矩阵;\n”
+“属性向量4 a_位置;\n”
+“void main()\n”
+“{\n”
+“gl\u位置=u\u MVP矩阵\n”
+“*一个位置;\n”
+“gl_PointSize=10.0;\n”
+“}\n”;
最终字符串碎片着色器=
“精度中间泵浮动;\n”
+“void main()\n”
+“{\n”
+“gl\u FragColor=vec4(1.0,\n”
+“1.0,1.0,1.0);\n”
+“}\n”;
//加载顶点着色器。
int vertexShaderHandle=GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
如果(vertexShaderHandle!=0){
//传入着色器源。
GLES20.glShaderSource(vertexShaderHandle,vertexShader);
//编译着色器。
GLES20.glCompileShader(vertexShaderHandle);
//获取编译状态。
final int[]compileStatus=new int[1];
GLES20.glGetShaderiv(vertexShaderHandle,GLES20.GLU编译状态,编译状态,0);
//如果编译失败,请删除着色器。
if(compileStatus[0]==0){
GLES20.glDeleteShader(vertexShaderHandle);
vertexShaderHandle=0;
}
}
如果(vertexShaderHandle==0){
抛出新的RuntimeException(“创建顶点着色器时出错”);
}
//加载片段着色器。
int fragmentShaderHandle=GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
if(fragmentShaderHandle!=0){
//传入着色器源。
GLES20.glShaderSource(fragmentShaderHandle,fragmentShader);
//编译着色器。
GLES20.glCompileShader(fragmentShaderHandle);
//获取编译状态。
final int[]compileStatus=new int[1];
GLES20.glGetShaderiv(fragmentShaderHandle,GLES20.GL_COMPILE_STATUS,compileStatus,0);
//如果编译失败,请删除着色器。
if(compileStatus[0]==0){
GLES20.glDeleteShader(fragmentShaderHandle);
fragmentShaderHandle=0;
}
}
if(fragmentShaderHandle==0){
抛出新的RuntimeException(“创建片段着色器时出错”);
}
//创建程序对象并存储其句柄。
int programHandle=GLES20.glCreateProgram();
if(programHandle!=0){
//将顶点着色器绑定到程序。
GLES20.glAttachShader(程序句柄,vertexShaderHandle);
//将片段着色器绑定到程序。
GLES20.glAttachShader(程序句柄、碎片着色器句柄);
//绑定属性
GLES20.GLBindAttriblLocation(程序句柄,0,“a_位置”);
//将两个着色器链接到一个程序中。
GLES20.glLinkProgram(程序句柄);
//获取链接状态。
最终整数[]链接状态=新整数[1];
GLES20.glGetProgramiv(程序句柄,GLES20.GLU链接状态,链接状态,0);
//如果链接失败,请删除该程序。
如果(链接状态[0]==0){
GLES20.glDeleteProgram(程序句柄);
programHandle=0;
}
}
if(programHandle==0){
抛出新的RuntimeException(“创建程序时出错”);
}
//专业设置