OpenGLES10: применить проекцию и вид с камеры - PullRequest
1 голос
/ 16 октября 2011

Мне нужно немного помочь с этим: Android-разработчиков, учебные пособия: OpenGLES10. ссылка

Все отлично работает для первого треугольника, пока я не введу код для проекции и вида камеры. Это должно изменить размеры OpenGLES Square, чтобы соответствовать экрану телефона, поэтому объект остается в предложении. Когда я смотрю новичок, код выглядит хорошо, и я проверил ссылочные файлы, чтобы не пропустить параметр или что-то в этом роде. Но теперь я потерялся ..! Не вижу, что не так. Если применяется код Проекция и Камера, треугольника нет, кроме приложения. запущен, и отображаются View с 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.

Ответы [ 3 ]

1 голос
/ 10 апреля 2018

У меня была та же проблема с этим уроком, и она была решена, когда я изменил порядок умножения в коде вершинного шейдера в классе Triangle . Поэтому вместо uMVPMatrix * vPosition замените его на vPosition * uMVPMatrix. Я думаю, причина этого в том, что vPosition - это вектор строки.

0 голосов
/ 16 октября 2011

Код выглядит резонансным (если вы раскомментируете части, которые закомментированы в данный момент).Ваш код модификации матрицы совершенно правильный, и все преобразования применяются к правильным матрицам.

Но в данный момент вы смотрите из точки (0,0, -5) в точку (0,0,0) и, следовательно, вдоль оси + z.Но поскольку представление OpenGL по умолчанию выглядит вдоль оси -z, вы фактически поворачиваете представление на 180 градусов вокруг оси y.В то время как это абсолютно не проблема, теперь вы видите обратную сторону треугольника.Так может ли быть так, что у вас включена выборка задней стороны, и эта задняя сторона просто оптимизирована?Просто попробуйте отключить выборку с обратной стороны, вызвав glDisable(GL_CULL_FACE) или изменив -5 в вызове gluLookAt на 5, чтобы вы смотрели вдоль оси -z.

Вы также можете попробоватьиспользовать gluPerspective(45, ratio, 3, 7) вместо вызова glFrustum, но ваши аргументы glFrustum выглядят вполне разумно.Конечно, имейте в виду, что оба вызова создают перспективный вид, с дальнейшим уменьшением размеров объектов, как в реальности.Если вы действительно хотите параллельное / орфографическое представление (где размер на экране не зависит от глубины), вы должны заменить glFrustum на glOrtho, хотя параметры могут остаться прежними.

0 голосов
/ 16 октября 2011

Ваш звонок в 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...