我需要一点帮助:android开发者教程:OpenGLES10。一个链接
对于第一个三角形来说一切都很好,直到我放入投影&相机视图。这将调整OpenGLES Square视图以匹配手机屏幕,因此对象保持比例。作为一个新手看,代码看起来很好,我已经检查了参考文件,没有遗漏一个参数或类似的东西。但现在我迷路了!看不出有什么问题。如果投影和相机代码应用,没有三角形,但应用程序正在运行,并显示背景色的视图。
下面是我的代码: package notme.helloopengles10;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLSurfaceView;
import android.opengl.GLU;
public class HelloOpenGLES10Renderer implements GLSurfaceView.Renderer {
// Set the background frame color
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
// initialize the triangle vertex array
initShapes();
//enable use of vertex arrays
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
}
public void onDrawFrame(GL10 gl) {
// Redraw background color
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
/* // set GL_MODELVIEW transformation mode (If outline from here to after GLU.gluLookAt() - it works when also outlines further down i code!
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity(); // reset Matrix to its default state
// when using GL_MODELVIEW, you must set the view point
GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f); */
//Draw Triangel
gl.glColor4f(0.63671875f, 0.76953125f, 0.22265625f, 0.0f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleVB);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
}
// Redraw on orientation changes // adjust for screen size ratio
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
// Make adjustments for screen ratio
/*(If outline from here to after gl.Frumstumf() - it works!
float ratio = (float) width / height;
gl.glMatrixMode(GL10.GL_PROJECTION); // set matrix to projection mode
gl.glLoadIdentity(); // reset the matrix to its default state
gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); // apply the projection */
}
/*
* Draw a shape, a triangle. first add new member variable to contain
* the vertices of a triangle
*/
private FloatBuffer triangleVB;
//Create a method, initShaoe(), which populate the members variable
private void initShapes(){
//create a array
float triangleCoords[] = {
// X, Y, Z
-0.5f, -0.25f, 0,
0.5f, -0.25f, 0,
0.0f, 0,559016994f, 0
};
// initialize vertex Buffer for triangle
ByteBuffer vbb= ByteBuffer.allocateDirect(
//(# of coordinates values * 4 bytes per float)
triangleCoords.length * 4 );
vbb.order(ByteOrder.nativeOrder()); // use device hardware's native byte order
triangleVB = vbb.asFloatBuffer(); //create floating point buffer from the ByteBuffer
triangleVB.put(triangleCoords); // add coordinates to the FloatBuffer
triangleVB.position(0); // set the buffer to read the first coordinate
}
} // end
我希望有人能告诉我,哪里出了问题?
DevTool: Eclipse。
我在本教程中遇到了同样的问题,当我在三角形类中改变顶点着色代码中的乘法顺序时,问题得到了解决。所以不是用uMVPMatrix * vPosition
,而是用vPosition * uMVPMatrix
。我想这是因为vPosition
是一个行向量。
代码看起来是合理的(如果您取消当前被注释掉的部分)。你的矩阵修改代码是非常正确的,所有的转换都应用到正确的矩阵。
但现在你是从点(0,0,-5)到点(0,0,0),因此沿着+z轴。但是因为默认的OpenGL视图沿着-z轴看,你实际上围绕y轴旋转视图180度。这完全没有问题,你现在看到三角形的背面。有没有可能,你启用了背面剔除而背面被优化掉了?只需通过调用glDisable(GL_CULL_FACE)
或将gluLookAt
调用中的-5
更改为5
来禁用背面剔除,以便您沿着-z轴查看。
您也可以尝试使用gluPerspective(45, ratio, 3, 7)
而不是glFrustum
调用,但是您对glFrustum
的参数看起来相当合理。当然,请记住,这两个调用都创建一个透视图,更远的对象变得更小,就像在现实中一样。如果你真的想要一个平行/正交视图(屏幕大小与深度无关),你应该用glOrtho
替换glFrustum
,尽管参数可以保持不变。
对gluLookAt的调用会破坏你的modelview矩阵。你应该在激活投影矩阵时调用这个函数。
http://www.opengl.org/sdk/docs/man/xhtml/gluLookAt.xml下面的代码为我显示了三角形:
public void onDrawFrame(GL10 gl) {
// Redraw background color
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
// when using GL_MODELVIEW, you must set the view point
GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
// set GL_MODELVIEW transformation mode (If outline from here to after GLU.gluLookAt() - it works when also outlines further down i code!
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity(); // reset Matrix to its default state
//Draw Triangel
gl.glColor4f(0.63671875f, 0.76953125f, 0.22265625f, 0.0f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleVB);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
}