java - OpenGL 在面向对象模型中将 glVertexAttribPointer 放在哪里?

标签 java oop opengl lwjgl object-oriented-analysis

在学习 OpenGL 的过程中,我正在使用 Java/LWJGL,并且正在围绕 LWJGL 创建自己的轻型面向对象框架,但是我对如何使用 glVertexAttribPointer 感到非常困惑>.

采用我的以下代码:

public class GameController extends Controller {
    //<editor-fold defaultstate="collapsed" desc="keep-imports">    
    static {
        int KEEP_LWJGL_IMPORTS = GL_2_BYTES | GL_ALIASED_LINE_WIDTH_RANGE | GL_ACTIVE_TEXTURE | GL_BLEND_COLOR | GL_ARRAY_BUFFER | GL_ACTIVE_ATTRIBUTE_MAX_LENGTH | GL_COMPRESSED_SLUMINANCE | GL_ALPHA_INTEGER | GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH | GL_ALREADY_SIGNALED | GL_ANY_SAMPLES_PASSED | GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH | GL_ACTIVE_PROGRAM | GL_ACTIVE_ATOMIC_COUNTER_BUFFERS | GL_ACTIVE_RESOURCES | GL_BUFFER_IMMUTABLE_STORAGE;
        int KEEP_OWN_IMPORTS = PROJECTION_MATRIX.getLocation();
    }
//</editor-fold>

    private Program testProgram;
    private VertexArray vertexArray;
    private ArrayBuffer arrayBuffer;

    private final Matrix4f modelviewMatrix = new Matrix4f();
    private final FloatBuffer modelViewMatrixBuffer = BufferUtils.createFloatBuffer(16);

    private float aspect;
    private Matrix4f projectionMatrix;

    final float[] vertexPositions = new float[] {
        -0.25f,  0.25f, -0.25f,
        -0.25f, -0.25f, -0.25f,
         0.25f, -0.25f, -0.25f,

         0.25f, -0.25f, -0.25f,
         0.25f,  0.25f, -0.25f,
        -0.25f,  0.25f, -0.25f,

         0.25f, -0.25f, -0.25f,
         0.25f, -0.25f,  0.25f,
         0.25f,  0.25f, -0.25f,

         0.25f, -0.25f,  0.25f,
         0.25f,  0.25f,  0.25f,
         0.25f,  0.25f, -0.25f,

         0.25f, -0.25f,  0.25f,
        -0.25f, -0.25f,  0.25f,
         0.25f,  0.25f,  0.25f,

        -0.25f, -0.25f,  0.25f,
        -0.25f,  0.25f,  0.25f,
         0.25f,  0.25f,  0.25f,

        -0.25f, -0.25f,  0.25f,
        -0.25f, -0.25f, -0.25f,
        -0.25f,  0.25f,  0.25f,

        -0.25f, -0.25f, -0.25f,
        -0.25f,  0.25f, -0.25f,
        -0.25f,  0.25f,  0.25f,

        -0.25f, -0.25f,  0.25f,
         0.25f, -0.25f,  0.25f,
         0.25f, -0.25f, -0.25f,

         0.25f, -0.25f, -0.25f,
        -0.25f, -0.25f, -0.25f,
        -0.25f, -0.25f,  0.25f,

        -0.25f,  0.25f, -0.25f,
         0.25f,  0.25f, -0.25f,
         0.25f,  0.25f,  0.25f,

         0.25f,  0.25f,  0.25f,
        -0.25f,  0.25f,  0.25f,
        -0.25f,  0.25f, -0.25f
    };

    public GameController(final boolean debug) {
        super(debug);
    }

    @Override
    protected void init() {
        glViewport(0, 0, 800, 600);
        testProgram = new Program(
                new VertexShader("shaders/test.vert.glsl").compile(),
                new FragmentShader("shaders/test.frag.glsl").compile()
                ).compile();
        testProgram.use();

        vertexArray = new VertexArray().create().bind();
        arrayBuffer = new StaticDrawArrayBuffer().create().fillData(vertexPositions);
        glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
        glEnableVertexAttribArray(0);

        aspect = 800f / 600f;
        projectionMatrix = new Matrix4f().identity().perspective(50.0f, aspect, 0.1f, 1000.0f);
        Uniforms.setUniformMatrix4(PROJECTION_MATRIX, false, projectionMatrix);

        glEnable(GL_CULL_FACE);
        glFrontFace(GL_CW);

        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GL_LEQUAL);
    }

    @Override
    protected void render(final double msDelta) {
        glClearColor(0.0f, 0.25f, 0.0f, 1.0f);
        glClearDepthf(1f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        testProgram.use();

        for (int i = 0; i < 24000; i++) {
            float fVar = i + currentTime / 1000f * 0.3f;
            modelviewMatrix.identity()
                    .translate(0.0f, 0.0f, -8.0f)   //translate
                    .rotate(currentTime / 1000f * 45.0f, 0.0f, 1.0f, 0.0f)  //rotate around Y
                    .rotate(currentTime / 1000f * 21.0f, 1.0f, 0.0f, 0.0f)  //rotate around X
                    .translate(
                        (float)Math.sin(2.1f * fVar) * 2.0f,
                        (float)Math.cos(1.7f * fVar) * 2.0f,
                        (float)Math.sin(1.3f * fVar) * (float)Math.cos(1.5f * fVar) * 2.0f
                    );  //translate
            Uniforms.setUniformMatrix4(MODELVIEW_MATRIX, false, modelviewMatrix.writeToFloatBuffer(modelViewMatrixBuffer));
            testProgram.drawArrays(GL_TRIANGLES, 0, 36);
        }
    }

    @Override
    protected void shutdown() {
        testProgram.delete();
        vertexArray.delete();
        arrayBuffer.delete();
    }

    @Override
    protected void windowResized(final int width, final int height) {
        aspect = width * 1.0f / height;
        projectionMatrix = new Matrix4f().identity().perspective(50.0f, aspect, 0.1f, 1000.0f);
        Uniforms.setUniformMatrix4(PROJECTION_MATRIX, false, projectionMatrix);
    }

    public static void main(String[] args) {
        Controller controller = new GameController(false);
        controller.start();
    }
}

我希望有人能准确地解释我应该在面向对象模型中放置 glVertexAttribPointerglEnableVertexAttribArray ,例如在 VertexArray 中,或者在 ArrayBuffer 中(Buffer 是父类(super class)),或者甚至在 Program 中?
我认为我对框架的所有底层调用都是不言自明的,否则请随意询问。

最佳答案

如果不看看这个语句是如何实现的,很难说:

   arrayBuffer = new StaticDrawArrayBuffer().create().fillData(vertexPositions);

假设为了创建并填充您的 arrayBuffervertexPositions ,该函数的副作用为 glBindBuffer (GL_ARRAY_BUFFER, ...)那么您可以调用glVertexAttribPointer (...)有意义。

但是,我要明确指出,fillData (...)已经说了副作用。正如您现在的代码所示,没有人会通过查看它知道该行代码实际上绑定(bind)了一个缓冲区对象。为了保持一致性,您甚至可以考虑添加 bind (...)方法给你StaticDrawArrayBuffer类并在 glVertexAttribPointer (...) 之前调用它.

至于哪个类应该包装您讨论的函数,这些都是按顶点数组对象存储的。因此将它们添加到 VertexArray 。您甚至可能想要修改 VertexAttribPointer包装器接口(interface),以便它引用缓冲区对象,而不是像 GL API 那样使用选择器/锁存器机制。

关于java - OpenGL 在面向对象模型中将 glVertexAttribPointer 放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21205393/

相关文章:

c++ - 使用 Eclipse 的 Cygwin 中的 FLTK(链接错误)

java - 使用 JdbcTemplate 插入多行

java - 如何使用 Spring 在枚举构造函数中注入(inject)参数?

php - 有没有办法将对象反序列化为 "$this"?

python - super 会尝试 MRO 中的每个类吗

java - 聚合对象建模的正确方法是什么?

c++ - 将数据从 std::vector 传递到 glsl 中的统一数组

dictionary - ConcurrentHashMap如何获取tailMap?

java - 与独立的 Java 应用程序共享 Grails 数据库?

c++ - 无法正确定义一个 QUAD