Android Emulator与手机opengl不一致
我遇到了一个问题,我的应用程序在我的模拟器上看起来不错,但在我的手机上它只显示了我场景的一部分 图像(模拟器位于右侧 这里可以看到我的渲染器代码。(这个类是抽象的,但实现类所做的只是绘制多边形)Android Emulator与手机opengl不一致,android,opengl-es,Android,Opengl Es,我遇到了一个问题,我的应用程序在我的模拟器上看起来不错,但在我的手机上它只显示了我场景的一部分 图像(模拟器位于右侧 这里可以看到我的渲染器代码。(这个类是抽象的,但实现类所做的只是绘制多边形) 公共抽象类AbstractRenderer实现渲染器{ 浮动x=0.5f; 浮动y=1f; 浮点数z=3; 布尔显示坐标系统=真; 已创建表面上的公共空白(GL10 gl、EGLConfig EGLConfig){ gl.glDisable(GL10.gl\u抖动); gl.glHint(GL10.gl
公共抽象类AbstractRenderer实现渲染器{
浮动x=0.5f;
浮动y=1f;
浮点数z=3;
布尔显示坐标系统=真;
已创建表面上的公共空白(GL10 gl、EGLConfig EGLConfig){
gl.glDisable(GL10.gl\u抖动);
gl.glHint(GL10.gl\u透视图\u校正\u提示,GL10.gl\u最快);
gl.glClearColor(.5f、.5f、.5f、1);
gl.glShadeModel(GL10.glu平滑);
gl.glEnable(GL10.gl_深度_试验);
}
表面上的公共空隙已更改(GL10 gl、int w、int h){
gl.glViewport(0,0,w,h);
浮动比率=(浮动)w/h;
gl.glMatrixMode(GL10.gl_投影);
gl.glLoadIdentity();
gl.glFrustumf(-ratio,ratio,-1,1,0,10);
}
公共框架(GL10 gl){
gl.glDisable(GL10.gl\u抖动);
gl.glClear(GL10.gl_颜色_缓冲_位| GL10.gl_深度_缓冲_位);
gl.glMatrixMode(GL10.gl_MODELVIEW);
gl.glLoadIdentity();
GLU.gluLookAt(gl,x,y,z,0f,0,0f,0f,1f,0f);
gl.glEnableClientState(GL10.gl_顶点数组);
if(显示协调系统){
绘图坐标系统(gl);
}
绘图(gl);
//gl.glFlush();
}
专用坐标系统(GL10 gl){
ByteBuffer vbb=ByteBuffer.allocateDirect(6*3*4);
vbb.order(ByteOrder.nativeOrder());
FloatBuffer顶点=vbb.asFloatBuffer();
ByteBuffer ibb=ByteBuffer.allocateDirect(6*2);
ibb.order(ByteOrder.nativeOrder());
ShortBuffer index=ibb.asShortBuffer();
最终浮动坐标长度=27f;
//添加点(-1,0,0)
顶点。放置(-coordLength);
顶点。放置(0);
顶点。放置(0);
//添加点(1、0、0)
顶点。放置(坐标长度);
顶点。放置(0);
顶点。放置(0);
//添加点(0,-1,0)
顶点。放置(0);
顶点。放置(-coordLength);
顶点。放置(0);
//添加点(0,1,0)
顶点。放置(0);
顶点。放置(坐标长度);
顶点。放置(0);
//添加点(0,0,-1)
顶点。放置(0);
顶点。放置(0);
顶点。放置(-coordLength);
//添加点(0、0、1)
顶点。放置(0);
顶点。放置(0);
顶点。放置(坐标长度);
对于(int i=0;i<6;i++){
指数.put((short)i);
}
顶点位置(0);
指数。位置(0);
gl.glColor4f(1,1,0,0.5f);
gl.glVertexPointer(3,GL10.gl_FLOAT,0,顶点);
gl.gld元素(GL10.gl\u行,2,GL10.gl\u无符号\u短,索引);
排名(2);
gl.glColor4f(0,1,0,0.5f);
gl.gld元素(GL10.gl\u行,2,GL10.gl\u无符号\u短,索引);
排名(4);
gl.glColor4f(0,0,1,0.5f);
gl.gld元素(GL10.gl\u行,2,GL10.gl\u无符号\u短,索引);
}
受保护的抽象无效图纸(GL10 gl);
}
我的猜测是,我没有设置emulator实现默认设置的值。唯一的问题是我不知道该值可能是什么
希望能听到你们这些家伙的声音!这是一个深度缓冲区问题:从手册页的“备注”部分: “近”不能设置为0
您应该计算距离相机尽可能远的“近”值,以及距离尽可能近的值,同时仍然包含要绘制的内容。这是深度缓冲区问题:从手册页的“注释”部分: “近”不能设置为0
您应该计算距离摄影机尽可能远的“近”值,以及距离摄影机尽可能近的值,同时仍包含要绘制的对象。此外,看起来您的顶点距离摄影机27个单位,而您的“远”距离仅为10个单位。良好的起点应该是gl.glFrustumf(..,0.1f,100.0f);然后你可以按照ryanm的建议调整这些值。@Gilead我不太关心不能在全长atm上显示的顶点(无论如何,它们在发布应用程序之前都会消失)。但是,您确实提供了一种有用的方法来调整frustrum的正确值。Thx非常适合您的输入!而且,看起来您的顶点距离摄影机27个单位,距离仅为10个单位。良好的起点应该是gl.glFrustumf(..,0.1f,100.0f);然后你可以按照ryanm的建议调整这些值。@Gilead我不太关心不能在全长atm上显示的顶点(它们在发布应用程序之前就已经消失了。)。不过,你确实提供了一种有用的方法来调整frustrum.Thx的正确值,以供输入!
public abstract class AbstractRenderer implements Renderer {
float x = 0.5f;
float y = 1f;
float z = 3;
boolean displayCoordinateSystem = true;
public void onSurfaceCreated(GL10 gl, EGLConfig eglConfig) {
gl.glDisable(GL10.GL_DITHER);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
gl.glClearColor(.5f, .5f, .5f, 1);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glEnable(GL10.GL_DEPTH_TEST);
}
public void onSurfaceChanged(GL10 gl, int w, int h) {
gl.glViewport(0, 0, w, h);
float ratio = (float) w / h;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(-ratio, ratio, -1, 1, 0, 10);
}
public void onDrawFrame(GL10 gl) {
gl.glDisable(GL10.GL_DITHER);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
GLU.gluLookAt(gl, x, y, z, 0f, 0, 0f, 0f, 1f, 0f);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
if(displayCoordinateSystem) {
drawCoordinateSystem(gl);
}
draw(gl);
// gl.glFlush();
}
private void drawCoordinateSystem(GL10 gl) {
ByteBuffer vbb = ByteBuffer.allocateDirect(6*3*4);
vbb.order(ByteOrder.nativeOrder());
FloatBuffer vertices = vbb.asFloatBuffer();
ByteBuffer ibb = ByteBuffer.allocateDirect(6*2);
ibb.order(ByteOrder.nativeOrder());
ShortBuffer indexes = ibb.asShortBuffer();
final float coordLength = 27f;
//add point (-1, 0, 0)
vertices.put(-coordLength);
vertices.put(0);
vertices.put(0);
//add point (1, 0, 0)
vertices.put(coordLength);
vertices.put(0);
vertices.put(0);
//add point (0, -1, 0)
vertices.put(0);
vertices.put(-coordLength);
vertices.put(0);
//add point (0, 1, 0)
vertices.put(0);
vertices.put(coordLength);
vertices.put(0);
//add point (0, 0, -1)
vertices.put(0);
vertices.put(0);
vertices.put(-coordLength);
//add point (0, 0, 1)
vertices.put(0);
vertices.put(0);
vertices.put(coordLength);
for(int i = 0; i < 6; i++) {
indexes.put((short)i);
}
vertices.position(0);
indexes.position(0);
gl.glColor4f(1, 1, 0, 0.5f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices);
gl.glDrawElements(GL10.GL_LINES, 2, GL10.GL_UNSIGNED_SHORT, indexes);
indexes.position(2);
gl.glColor4f(0, 1, 0, 0.5f);
gl.glDrawElements(GL10.GL_LINES, 2, GL10.GL_UNSIGNED_SHORT, indexes);
indexes.position(4);
gl.glColor4f(0, 0, 1, 0.5f);
gl.glDrawElements(GL10.GL_LINES, 2, GL10.GL_UNSIGNED_SHORT, indexes);
}
protected abstract void draw(GL10 gl);
}