gpt4 book ai didi

java - 为什么我的 android openGL ES 测试渲染器崩溃

转载 作者:行者123 更新时间:2023-11-30 11:57:18 24 4
gpt4 key购买 nike

我又一次尝试进入 openGL,但像往常一样,我在传递顶点/顶点/任何东西时感到窒息,每一个小细节都可能导致灾难(错误的格式,未正确设置初始化,保存内存的位置,等)。

我的主要目标是将 openGL 用于 2D 图形,以提高与常规 cpu 绘图相比的性能。

无论如何,我的 openGL 渲染器看起来像这样:

package com.derp.testopengl;


import java.nio.Buffer;
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.GLU;
import android.opengl.GLSurfaceView.Renderer;

public class OpenGLRenderer implements Renderer {

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// Set the background color to black ( rgba ).
gl.glClearColor(1.0f, 0.0f, 0.0f, 0.5f); // OpenGL docs.
// Enable Smooth Shading, default not really needed.
gl.glShadeModel(GL10.GL_SMOOTH);// OpenGL docs.
// Depth buffer setup.
gl.glClearDepthf(1.0f);// OpenGL docs.
// Enables depth testing.
gl.glEnable(GL10.GL_DEPTH_TEST);// OpenGL docs.
// The type of depth testing to do.
gl.glDepthFunc(GL10.GL_LEQUAL);// OpenGL docs.
// Really nice perspective calculations.
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, // OpenGL docs.
GL10.GL_NICEST);
}


public void onDrawFrame(GL10 gl) {
// Clears the screen and depth buffer.
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | // OpenGL docs.
GL10.GL_DEPTH_BUFFER_BIT);

// Define the points of my triangle
float floatbuff[] = {
1.0f,0.0f,0.0f,
0.0f,1.0f,0.0f,
-1.0f,0.0f,0.0f
};
// Create memory on the heap
ByteBuffer vbb = ByteBuffer.allocateDirect(3 * 3 * 4);
vbb.order(ByteOrder.nativeOrder());
FloatBuffer vertices = vbb.asFloatBuffer();

// Insert points into floatbuffer
vertices.put(floatbuff);
// Reset position
vertices.position(0);

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

// Change color to green
gl.glColor4f(0.0f, 1.0f, 0.0f, 1.0f);

// Pass vertices to openGL
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices);

// Draw 'em
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}


public void onSurfaceChanged(GL10 gl, int width, int height) {
// Sets the current view port to the new size.
gl.glViewport(0, 0, width, height);// OpenGL docs.
// Select the projection matrix
gl.glMatrixMode(GL10.GL_PROJECTION);// OpenGL docs.
// Reset the projection matrix
gl.glLoadIdentity();// OpenGL docs.

// Should give a 2D coordinate system that responds to the screen
gl.glOrthof(0.0f, width, 0.0f, height, 0, 200.0f);

gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();// OpenGL docs.
}
}

它当前在线上崩溃:

gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);

有一个 IndexOutOfBoundsException,但我确信代码还有更多问题。

感谢任何帮助!

最佳答案

您可能已经解决了它,但我想我已经为其他人提供了答案。当您调用此行时:

gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);

你是说顶点缓冲区中有 3 个三角形。但实际上有1个三角形。您应该将 3 替换为:

vertices.length / 3

这样,如果您为更多的多边形添加更多的点,它就会正确地渲染它。希望这会有所帮助。

-布莱恩

PS:我目前正在学习如何将 opengl 与 android 一起使用。所以我也在解决所有这些小问题。祝你好运:)

关于java - 为什么我的 android openGL ES 测试渲染器崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3894729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com