【问题标题】:JOGL draw VBO black screenJOGL画VBO黑屏
【发布时间】:2018-01-20 18:18:19
【问题描述】:

我开始尝试使用 JOGL 绘制 VBO。在此之前,我在 glBegin 和 glEnd 的帮助下绘图,一切正常。然后我只看到一个黑屏。可能是什么问题呢?我在某处读到使用 VBO 进行绘图需要着色器。是这样吗? 代码:

public class Main implements GLEventListener {

       public static DisplayMode dm, dm_old;
       private GLU glu = new GLU();
       private float xrot,yrot,zrot;
       private int texture;
       Texture t;
       @Override
       public void display(GLAutoDrawable drawable) {
          final GL2 gl = drawable.getGL().getGL2();
          gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
          gl.glLoadIdentity(); // Reset The View
          gl.glTranslatef(0f, 0f, -5.0f);

          gl.glBindTexture(GL2.GL_TEXTURE_2D, texture);

          final float[] coordData = {
                  0, 0, //
                  1, 0, //
                  0, 1, //
          };
          final float[] vertices = {
                  -1.0f, -1.0f, 1.0f,
                  1.0f, -1.0f, 1.0f,
                  -1.0f, 1.0f, 1.0f,
          };
          // Setup the vertices into the buffer
          FloatBuffer verts = Buffers.newDirectFloatBuffer(vertices.length);
          verts.put(vertices).position(0);

          // Setup the texture coordinates
          FloatBuffer coords = Buffers.newDirectFloatBuffer(coordData.length);
          coords.put(coordData).position(0);

          gl.glVertexPointer(3, GL2.GL_FLOAT, 0, verts);
          gl.glTexCoordPointer(2, GL2.GL_FLOAT, 0, coords);
          gl.glDrawArrays(GL2.GL_TRIANGLES, 0, 3);

          //change the speeds here
          xrot += 5f;
       }

       @Override
       public void init(GLAutoDrawable drawable) {
          final GL2 gl = drawable.getGL().getGL2();
          gl.glShadeModel(GL2.GL_SMOOTH);
          gl.glClearColor(0f, 0f, 0f, 0f);
          gl.glClearDepth(1.0f);
          gl.glEnable(GL2.GL_DEPTH_TEST);
          gl.glDepthFunc(GL2.GL_LEQUAL);
          gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST);

          gl.glEnable(GL2.GL_TEXTURE_2D);
          try {
             File im = new File("/home/congard/pic/t.jpeg");
             t = TextureIO.newTexture(im, true);
             texture= t.getTextureObject(gl);

          }catch(IOException e){
             e.printStackTrace();
          }
       }

       @Override
       public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
          // TODO Auto-generated method stub
       }

       public static void main(String[] args) {
            // some code
       }
}

【问题讨论】:

  • 您的源代码中还有其他错误。首先,您不应该直接调用“new GLU()”,而是在实现 GLEventListener.init() 的方法中调用 GLU.createGLU(GL)。我不建议您将低级纹理 API 调用与高级纹理 API 调用混合使用,要么在任何地方使用 Texture 对象,要么将其标识符与 glBindTexture() 一起使用,...

标签: java opengl jogl


【解决方案1】:

您没有启用顶点和纹理坐标的客户端功能。见Client-Side Vertex ArraysglEnableClientState

将以下内容添加到您的代码中:

gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL2.GL_TEXTURE_COORD_ARRAY);

gl.glVertexPointer(3, GL2.GL_FLOAT, 0, verts);
gl.glTexCoordPointer(2, GL2.GL_FLOAT, 0, coords);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    相关资源
    最近更新 更多