JOGL/OpenGL VBO - 如何渲染顶点?

2024-07-04

3我有以下SceneRenderer类,实现GLEventListener。我想我了解创建缓冲区、存储指向这些缓冲区的指针以及用数据填充这些缓冲区的过程(请参阅 init 方法)。

我奋斗的地方是展示()方法。我几乎尝试了在互联网上找到的所有内容的所有组合,但我仍然无法画出任何东西。有人可以解释我现在该怎么做吗,所有缓冲区都充满了等待渲染的数据?

package cz.pscheidl.gui;

import javax.media.opengl.*;
import javax.media.opengl.glu.GLU;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;


public class SceneRenderer implements GLEventListener {

private IntBuffer buffers = IntBuffer.allocate(2);
private float[] square = {
        -1.0f, -1.0f,
        1.0f, -1.0f,
        1.0f, 1.0f,
        1.0f, 1.0f,
        -1.0f, 1.0f,
        -1.0f, -1.0f,
};

private float[] colorData = {
        255, 0, 0,
        255, 255, 0,
        0, 255, 0,
        0, 255, 0,
        0, 0, 255,
        255, 0, 0
};

FloatBuffer vertexFB = FloatBuffer.wrap(square);
FloatBuffer colorFB = FloatBuffer.wrap(colorData);


GLU glu = new GLU();

@Override
public void init(GLAutoDrawable glAutoDrawable) {
    GL3 gl = glAutoDrawable.getGL().getGL3();

    gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);


    gl.glEnable(GL2.GL_DEPTH_TEST);
    gl.glClearDepthf(10.0f);
    gl.glClearColor(0.8f, 0.6f, 0.8f, 1.0f);
    gl.glDepthFunc(GL2.GL_LEQUAL);

    gl.glGenBuffers(2, buffers);

    gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, buffers.get(0));
    gl.glBufferData(GL2.GL_ARRAY_BUFFER, 4 * 6 * 2, vertexFB, GL3.GL_STATIC_DRAW);


    gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, buffers.get(1));
    gl.glBufferData(GL2.GL_ARRAY_BUFFER, 4 * 6 * 3, colorFB, GL2.GL_STREAM_DRAW);

}

@Override
public void dispose(GLAutoDrawable glAutoDrawable) {
}

@Override
public void display(GLAutoDrawable glAutoDrawable) {
    GL3 gl = glAutoDrawable.getGL().getGL3();
    gl.glClear(GL3.GL_DEPTH_BUFFER_BIT | GL3.GL_COLOR_BUFFER_BIT);


    gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, buffers.get(0));
    //After binding the buffer, now WHAT ?

}

@Override
public void reshape(GLAutoDrawable glAutoDrawable, int i, int i2, int i3, int i4) {
    GL3 gl = glAutoDrawable.getGL().getGL3();
    glu.gluPerspective(80.0f, 1920.0f / 1080.0f, 0.1f, 100f);

}
}

您缺少一些东西:

1. 着色器
着色器是在 GPU 上运行的程序。这就是告诉 GPU 如何处理数据的方式。这就是您创建一个非常基本的程序的方法,该程序具有顶点和片段着色器,可以显示您的网格。

将其与您的类级别 var 声明放在一起:

private int program;

这将进入你的 init() 函数:

// Create program.
program = gl.glCreateProgram();

// Create vertexShader.
int vertexShader = gl.glCreateShader(GL2ES2.GL_VERTEX_SHADER);
String[] vertexShaderSource = new String[1];
vertexShaderSource[0] = "#version 330\n" +
    "layout(location=0) in vec2 position;\n" +
    "layout(location=1) in vec3 color;\n" +
    "out vec3 vColor;\n" +
    "void main(void)\n" +
    "{\n" +
    "gl_Position = vec4(position, 0.0, 1.0);\n"
    "vColor = vec4(color, 1.0);\n"
    "}\n";
gl.glShaderSource(vertexShader, 1, vertexShaderSource, null);
gl.glCompileShader(vertexShader);

// Create and fragment shader.
int fragmentShader = gl.glCreateShader(GL2ES2.GL_FRAGMENT_SHADER);
String[] fragmentShaderSource = new String[1];
fragmentShaderSource[0] = "#version 330\n" +
    "in vec4 vColor;\n" +
    "out vec4 fColor;\n" +
    "void main(void)\n" +
    "{\n" +
    "fColor = vColor;\n" +
    "}\n";
gl.glShaderSource(fragmentShader, 1, fragmentShaderSource, null);
gl.glCompileShader(fragmentShader);

// Attach shaders to program.
gl.glAttachShader(program, vertexShader);
gl.glAttachShader(program, fragmentShader);
gl.glLinkProgram(program);


2. 顶点数组
绘制时需要使用两个缓冲区。顶点数组允许您存储多个缓冲区的状态并将数据发送到着色器程序中的不同位置。

将其与类级别的 var 声明放在一起:

IntBuffer vertexArray = IntBuffer.allocate(1);

创建缓冲区后,这也将进入您的 init() 函数:

// Create Vertex Array.
gl.glGenVertexArrays(1, vertexArray);
gl.glBindVertexArray(vertexArray.get(0));

// Specify how data should be sent to the Program.

// VertexAttribArray 0 corresponds with location 0 in the vertex shader.
gl.glEnableVertexAttribArray(0);
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, buffers.get(0));
gl.glVertexAttribPointer(0, 2, GL.GL_FLOAT, false, 0, 0);

// VertexAttribArray 1 corresponds with location 1 in the vertex shader.
gl.glEnableVertexAttribArray(1);
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, buffers.get(1));
gl.glVertexAttribPointer(1, 3, GL.GL_FLOAT, false, 0, 0);

您的 display() 函数现在应如下所示:

@Override
public void display(GLAutoDrawable glAutoDrawable) {
    GL3 gl = glAutoDrawable.getGL().getGL3();
    gl.glClear(GL3.GL_DEPTH_BUFFER_BIT | GL3.GL_COLOR_BUFFER_BIT);

    gl.glUseProgram(program)
    gl.glBindVertexArray(vertexArray.get(0));
    gl.glDrawArrays(GL.GL_TRIANGLES, 0, 6)
}

杂项注释:
- 颜色值的范围应为 0 到 1,而不是 0 到 255。
-您应该研究销毁您创建的 OpenGL 对象,以便在程序关闭或您不再需要它们时使用。
-我强烈建议阅读这些教程:OpenGL 书籍 http://openglbook.com/ and 学习现代 3D 图形编程 http://www.arcsynthesis.org/gltut/。代码示例是用 C++ 编写的,但我发现它们非常有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JOGL/OpenGL VBO - 如何渲染顶点? 的相关文章

随机推荐

  • 如何覆盖 nltk 的 pos_tag 分配给文本的 POS 标签?

    我使用 nltk 中的 pos tag 来标记一组 未标记的 技术文档中的文本并获得良好的结果 但它总是将 authenticated 等单词标记为动词 而有时它可以用作形容词 换句话说 仅仅改变标签并不是每次都有效 是否有一个好方法来覆盖
  • 嵌入式阵列文档中的 Morphia Mongodb 更新失败

    我是 Morphia 的新手 正在尝试更新嵌入式文档中的字段 这是当前的结构 class A List b BList class B String field 所以我的结构在 MongoDb 中如下所示 id ObjectId 5bab8
  • Python:多 QQ 绘图

    我是新人 通常来自 R 我想创建一个包含多行的 QQ Plot 我有一个测试版分布式数据集 我想尝试不同的 beta 分布参数并在oneQQ Plot 以便更好地进行比较 如果我尝试下面的代码 每个图都有相同的颜色 并且我得到 3 条 QQ
  • 我可以通过 Reflection 获取私有财产的价值吗?

    它似乎不起作用 ref new ReflectionObject obj if ref gt hasProperty privateProperty print r ref gt getProperty privateProperty 它进
  • Gulp Uglify 选项不适用

    您好 我正在为我工 作的公司制作一个主题 JS 部分无法在 uglify 中正确构建 我正在尝试使用 uglify 来简单地连接我的文件 这可以工作 但它们输出缩小和损坏 没有注释 我不明白为什么 下面是我的 gulp 任务 它运行正确 但
  • 如何在 ADF Oracle 11gR1 中的对话框窗口中的弹出窗口中刷新表

    我正在研究显示一个带有搜索表的弹出窗口的要求 当用户单击弹出窗口中的搜索按钮 提供输入文本框 时 需要使用新的数据集刷新搜索表 我创建了一个populateSearchTable 通过填充数组中的值来生成表的方法deviceListArra
  • MVC3 – ViewModel 和控制器功能:建议的设计模式

    我为一个不太可用的呼叫中心应用程序构建了一个简单的基于 MVC3 的票务输入站点 并尝试重构我的原型以更好地遵循设计模式 部分原因是为了使其更易于维护 但主要是作为一种学习练习 面向用户的视图是一种由基本用户信息以及允许选择各种资源类型的面
  • 将分层(树状)XML 读入 pandas 数据帧,保留层次结构

    我有一个 XML 文档 其中包含分层的树状结构 请参阅下面的示例 该文档包含几个
  • 尝试访问 USB 设备时出现 RPC_E_CANTCALLOUT_ININPUTSYNCCALL

    我有这段代码 var searcher new ManagementObjectSearcher root CIMV2 SELECT FROM Win32 DiskDrive foreach var queryObj in searcher
  • 如何防止使用外部客户端提供的任意 JSONB 查询字符串进行 SQL 注入?

    我有一个由 PostgreSQL 数据库支持的基本 REST 服务 其中有一个包含各种列的表 其中之一是包含任意数据的 JSONB 列 客户端可以将数据填充存储在固定列中 并提供任何 JSON 作为存储在 JSONB 列中的不透明数据 我希
  • BeautifulSoup 3.1 解析器太容易崩溃

    我在使用 BeautifulSoup 解析一些不可靠的 HTML 时遇到了麻烦 事实证明 新版本中使用的 HTMLParser 的容忍度低于以前使用的 SGMLParser BeautifulSoup 有某种调试模式吗 我正在尝试找出如何阻
  • 截至 2013 年,IE8 的响应式设计范围是否值得考虑?

    我仍然在这里看到与使响应式设计适用于 IE8 或 IE7 相关的问题 由于缺乏对 Windows 相关设备的了解 我的第一反应是 由于今天仍然运行 IE8 的移动设备数量微不足道 因此不值得为 IE8 实现响应式设计 对于这个特定的浏览器
  • 获取 PL/SQL 集合中元素的索引

    是否有内置函数可以确定 PL SQL 集合中元素的 第一个 索引 就像是 DECLARE TYPE t test IS TABLE OF VARCHAR2 1 v test t test BEGIN v test NEW t test A
  • 使用 SVG 的部分边框/描边

    我正在使用 svg d3 创建由 矩形 元素组成的图表 为每个矩形添加部分边框 描边 仅在矩形顶部 的最佳方法是什么 Thanks 我不认为 SVG 支持仅描边矩形或路径的一部分 描边不像 CSS 边框 您还有其他一些选择 所有这些都需要一
  • node.js 本机插件 - 包装类的析构函数不运行

    我正在用 C 编写一个 Node js 插件 我使用 node ObjectWrap 包装一些类实例 以将本机实例与 JavaScript 对象关联起来 我的问题是 包装实例的析构函数永远不会运行 这是一个例子 point cc inclu
  • Java JDK中有并发List吗?

    如何创建一个并发 List 实例 在其中可以按索引访问元素 JDK 有我可以使用的类或工厂方法吗 ConcurrentLinkedQueue 如果您不关心基于索引的访问 而只想要列表的插入顺序保留特性 那么您可以考虑java util co
  • PostgreSQL 使用“lag()”窗口函数更新查询

    我有一个涉及Postgresql数据库的任务 我对 SQL 不太有经验 我有一张贸易产品每周营业额的表格 每周提供以下信息 产品 周数 周营业额 可能是正值或负值 具体取决于天气 更多产品被购买或出售 我添加了一栏 其中包含每周的期末余额
  • for循环中的appendChild只添加1个孩子

    在 JavaScript 中 我使用 HTML 表格创建一个网格 您在 Photoshop 中看到的网格类型 网格大小是可变的 即可以由用户更改 因此必须计算每个网格方块的大小并将其除以可用像素数以获得精确大小的网格 我已经完成了所有这些
  • NERDTree - 如何删除文件

    如何使用 NERDTree 删除文件 vim 插件页面 http www vim org scripts script php script id 1658 我已将其放入我的 vimrc file set modifiable 但我不知道删
  • JOGL/OpenGL VBO - 如何渲染顶点?

    3我有以下SceneRenderer类 实现GLEventListener 我想我了解创建缓冲区 存储指向这些缓冲区的指针以及用数据填充这些缓冲区的过程 请参阅 init 方法 我奋斗的地方是展示 方法 我几乎尝试了在互联网上找到的所有内容