我需要一点帮助: android开发人员,教程:OpenGLES10。 a link
这一切都适用于第一个三角形,直到我输入Projection&的代码。相机视图。这应该重新设置OpenGLES Square视图以匹配Phone的屏幕,因此对象保持在propotions中。 作为一个新手看,代码看起来很好,我已经与参考文件cheked,没有错过参数或类似的东西。但现在我迷路了......!看不出有什么不对。 如果应用了Projection和Camera代码,则没有三角形,但应用程序。正在运行,并显示带有backgroundcolor的视图。
这是我的代码:
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。
答案 0 :(得分:1)
我在本教程中遇到了同样的问题,当我在三角形类中更改顶点着色器代码中的乘法顺序时,它得到了解决。因此,不要使用uMVPMatrix * vPosition
,而是将其替换为vPosition * uMVPMatrix
。我想这是因为vPosition
是一个行向量。
答案 1 :(得分:0)
代码看起来很合理(如果您取消注释当前注释掉的部分)。您的矩阵修改代码非常正确,所有转换都应用于正确的矩阵。
但目前你正在从点(0,0,-5)到点(0,0,0)并因此沿着+ z轴看。但由于默认的OpenGL视图沿-z轴看,实际上您将视图围绕y轴旋转180度。虽然这绝对没有问题,但现在您可以看到三角形的背面。那么,你是否可以启用背面剔除,这个背面是否被优化了?只需尝试通过调用glDisable(GL_CULL_FACE)
或将-5
调用中的gluLookAt
更改为5
来禁用背面剔除,以便沿-z轴查看。
您也可以尝试使用gluPerspective(45, ratio, 3, 7)
代替glFrustum
来电,但您对glFrustum
的论证看起来很合理。当然,请记住,两个调用都会创建一个透视图,更远的对象会变得更小,就像在现实中一样。如果您确实需要平行/正交视图(屏幕上的大小与深度无关),则应将glFrustum
替换为glOrtho
,但参数可以保持不变。
答案 2 :(得分:-1)
您对gluLookAt的调用会破坏您的模型视图矩阵。你应该在投影矩阵激活的情况下调用这个函数。
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);
}