Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >OpenGL/JOGL:顶点数组中的多个三角形扇形

OpenGL/JOGL:顶点数组中的多个三角形扇形
EN

Stack Overflow用户
提问于 2010-12-08 11:24:40
回答 1查看 7.3K关注 0票数 12

我正在使用顶点数组制作一些中等简单的形状,并且取得了一些不错的进展,但现在我想绘制2个(或更多)三角形扇形对象。有没有办法只给gl.glDrawArrays(GL.GL_TRIANGLE_FAN,...打一次电话,或者我需要为每个风扇单独打一个电话?

维基百科的Triangle strip文章描述了一种叫做原语重启的东西,但是OpenGL的Vertex Specification让我认为这不适用于顶点数组。

绘制多个三角形扇子的正确方法是什么?下面是我当前的绘制方法:

代码语言:javascript
运行
AI代码解释
复制
public void draw(GL gl){
if(vertices.length == 0)
    return;

gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL.GL_COLOR_ARRAY);
    gl.glEnableClientState(GL.GL_NORMAL_ARRAY);

    gl.glVertexPointer(3, GL.GL_FLOAT, 0, vertBuff);
    gl.glColorPointer(3, GL.GL_FLOAT, 0, colorBuff);
    gl.glNormalPointer(GL.GL_FLOAT,0, normalBuff);

    // drawArrays count is num of points, not indices.
    gl.glDrawArrays(GL.GL_TRIANGLES, 0, triangleCount);
    gl.glDrawArrays(GL.GL_QUADS, triangleCount, quadCount);
    gl.glDrawArrays(GL.GL_TRIANGLE_FAN, triangleCount+quadCount, fanCount);

    gl.glDisableClientState(GL.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL.GL_COLOR_ARRAY);
    gl.glDisableClientState(GL.GL_NORMAL_ARRAY);
}

编辑

我像这样更新了draw的相关部分:

代码语言:javascript
运行
AI代码解释
复制
    for(int i = 0; i < fanLength.length; i++){
        gl.glDrawArrays(GL.GL_TRIANGLE_FAN, 
            triangleCount+quadCount+fanDist[i], fanLength[i]);
    }

其中,fanDist是该风扇起点的偏移量(相对于风扇起点),fanLength是该风扇的长度。

这看起来确实有效,这很好,但是这是正确的方法吗?有没有更好的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-08 12:19:34

基元重启确实适用于顶点数组和顶点缓冲区-如果不这样做,它将不会真正有用。

但是,它在与glDrawArrays结合使用时确实没有用处。

让我们来看看两种技术:

原语重启

让我向您介绍glDrawElements:一个像这样的调用

代码语言:javascript
运行
AI代码解释
复制
glDrawArrays(mode, 0, 5);

类似于

代码语言:javascript
运行
AI代码解释
复制
GLuint idxs[] = {0, 1, 2, 3, 4}; // C code, but idea's the same in Java
glDrawElements(mode, 5, GL_UNSIGNED_INT, idxs);

因此,不是指定要从数组中提取的元素的精确索引,而是指定这些元素的。

然后你可以通过使用这样的数组来引入原语重启:

代码语言:javascript
运行
AI代码解释
复制
GLuint PRIMITIVE_RESTART = 12345; // magic value

glEnable(GL_PRIMITIVE_RESTART);
glPrimitiveRestartIndex(PRIMITIVE_RESTART);
GLuint idxs[] = {0, 1, 2, 3, PRIMITIVE_RESTART, 4, 5, 6, 7};
glDrawElements(mode, 9, GL_UNSIGNED_INT, idxs);

这将从前4个顶点绘制一个扇形,然后将遇到重新启动基本体的“符号”,然后它将绘制最后4个顶点的另一个扇形。

传递给DrawElements的索引不必是连续的范围!它们可以是任何顺序,并且可以按你想要的方式重复--这就是这个函数最好的部分。事实上,最好是尽可能频繁地重用一个索引,因为如果结果被缓存,顶点着色器只会处理一次。所以你可以像这样自由地制作缓冲区:

代码语言:javascript
运行
AI代码解释
复制
GLuint idxs[] = {0, 6, 3, 4, 6, 2, PRIMITIVE_RESTART, 2, 6, 3, 3, 5, 2}; // etc.

MultiDrawElements

在您的示例中,您可能希望改用glMultiDrawElements

如果你有20个顶点,你想从第一个顶点开始画一个8个顶点的扇形,从第10个顶点开始画一个10个顶点的扇形,你可以这样做:

代码语言:javascript
运行
AI代码解释
复制
// assuming glVertexPointer is already set
GLuint startingElements[] = {0, 9};
GLuint counts[] = {8, 10};
glMultiDrawArrays(GL_TRIANGLE_FAN, startingElements, counts, 2); // 2 fans

因此,您需要做的工作就少了一点。

选择你认为更有用的技术。我将留给您用Java/JOGL重写它,原理是相同的,但我想您必须使用Buffer类来完成所有这些工作。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4386861

复制
相关文章
如何在 Tableau 中对列进行高亮颜色操作?
在做数据分析时,如果数据量比较大,可以考虑使用颜色对重点关注的数据进行高亮操作,显眼的颜色可以帮助我们快速了解数据和发现问题。比如一个数据表可能会有十几到几十列之多,为了更好的看清某些重要的列,我们可以对表进行如下操作——
小马哥的牛棚
2020/08/20
6.1K0
php对‘[{“id“:“1“,“name“:“cyg”},{“id“:“2“,“name“:“liwen“}]json数据进行修改删除操作
作者:陈业贵 华为云享专家 51cto(专家博主 明日之星 TOP红人) 阿里云专家博主 文章目录 前言 代码 删除效果 修改效果 ---- 前言 对json数据进行修改删除操作,数组里面有两个
贵哥的编程之路
2022/10/24
1.2K0
php对‘[{“id“:“1“,“name“:“cyg”},{“id“:“2“,“name“:“liwen“}]json数据进行修改删除操作
在没有 Mimikatz 的情况下操作用户密码
通过利用Mimikatz的 lsadump::setntlm和lsadump::changentlm函数,过去已经涵盖了这两个用例。虽然Mimikatz是最好的攻击工具之一,但我会尽量避免使用它,因为它是反病毒和 EDR 工具的高度目标。在这篇文章中,我将专门讨论用例 #2 — 为横向移动或权限提升重置密码。
Khan安全团队
2022/03/21
2.2K0
Flutter:如何在没有插件的情况下制作旋转动画
本文将向您展示如何使用Flutter 中内置的RotationTransition小部件创建旋转动画。
徐建国
2022/03/30
1.8K0
Flutter:如何在没有插件的情况下制作旋转动画
在没有源代码的情况下对Linux二进制代码进行模糊测试
AFL配合DynamoRIO,没错,就是drAFL。在drAFL的帮助下,我们就可以在没有源代码的情况下对LInux二进制代码进行模糊测试了。
FB客服
2019/05/31
1.6K0
如何在不导致服务器宕机的情况下,用 PHP 读取大文件
协作翻译 原文:How to Read Big Files with PHP (Without Killing Your Server) 链接:https://www.sitepoint.com/performant-reading-big-files-php/ 译者:Tocy, Tony, 南宫冰郁, Tot_ziens 作为PHP开发人员,我们并不经常需要担心内存管理。PHP 引擎在我们背后做了很好的清理工作,短期执行上下文的 Web 服务器模型意味着即使是最潦草的代码也不会造成持久的影响。 很少情况下
企鹅号小编
2018/02/11
1.7K0
如何在不导致服务器宕机的情况下,用 PHP 读取大文件
如何在不会导致服务器宕机的情况下,用 PHP 读取大文件
英文:Christopher Pitt ,译文:oschina www.oschina.net/translate/performant-reading-big-files-php 作为PHP开发人员,我们并不经常需要担心内存管理。PHP 引擎在我们背后做了很好的清理工作,短期执行上下文的 Web 服务器模型意味着即使是最潦草的代码也不会造成持久的影响。 很少情况下我们可能需要走出这个舒适的地方 ——比如当我们试图在一个大型项目上运行 Composer 来创建我们可以创建的最小的 VPS 时,或者当我们需要
企鹅号小编
2018/02/08
1.3K0
如何在不会导致服务器宕机的情况下,用 PHP 读取大文件
PHP没有定时器?
确实,PHP没有类似于JS中的setInterval或者setTimeout这样的原生定时器相关的函数。但是我们可以通过其他方式来实现,比如使用declare。
硬核项目经理
2020/02/17
9750
使用 CLIP 对没有任何标签的图像进行分类
深度图像分类模型通常在大型带注释数据集上以监督方式进行训练。尽管模型的性能会随着更多注释数据的可用而提高,但用于监督学习的大规模数据集通常难以获得且成本高昂,需要专家注释者花费大量时间。考虑到这一点,人们可能会开始怀疑是否存在更便宜的监督资源。简而言之,是否有可能从已经公开可用的数据中学习高质量的图像分类模型?
小白学视觉
2022/12/27
3.6K0
使用 CLIP 对没有任何标签的图像进行分类
ocr文字识别软件是什么?要怎么进行操作
如今计算机领域可以说是发展得越来越好,而且也让我们的生活变得越来越方便快捷。比如在出国旅游的时候,我们已经可以通过一些软件应用来进行英文的扫描翻译,并且也可以实时进行语音翻译,即便是不会说英语的人也可以在国外轻松和他人交流。而如今纸质化的文件和电子化的文件也能够轻松实现转化,通过ocr文字识别软件即可以转换,那么ocr文字识别软件是什么呢?
用户8739990
2021/07/02
11.4K0
用程序对hdfs进行操作。
调试加安装了半天,怎么也没有配置好怎么通过Eclipse直接连接hdfs,最后我还是打成一个jar包放到Linux虚拟机中执行的。
用户5166556
2019/04/16
4840
php-php对mysql数据库的操作
连接mysql(mysql_connect()) 选择你创建的数据库(mysql_select_db()) sql语句的执行(mysql_query()) 显示取出来的数据(mysql_fetch_array()) 关闭连接(mysql_close())
kdyonly
2023/03/03
4.7K0
利用宝塔对服务器进行管理和操作
<!--more--> <a href="http%3A%2F%2Fimg.yzt-tools.com%2F20190516%2F20a36619bc298c6eb694465915817a2e.jpg%3Fx-oss-process%3Dimage%2Fresize%2Cw_600%2Fauto-orient%2C1%2Fquality%2Cq_90%2Fformat%2Cjpg" class="highslide" onclick="return hs.expand(this,{slideshowGro
王荣胜
2020/03/13
8870
Nat. Microbio.l | BacterA I:在没有先验知识的情况下对微生物代谢进行建模
今天为大家介绍的是来自Paul A. Jensen团队的一篇利用强化学探索微生物知识的论文。训练人工智能(AI)系统进行自主实验可以大大提高微生物学的吞吐量;然而,很少有微生物有足够大的数据集来训练这样的系统。在本研究中,作者引入了一种名为BacterAI的自动化科学平台,它可以对微生物代谢进行建模,不需要任何先前知识。BacterAI通过将科学问题转化为与实验室机器人进行的简单游戏来进行学习。该方法将其发现总结为可以被人类科学家解释的逻辑规则。
DrugAI
2023/09/19
3220
Nat. Microbio.l | BacterA I:在没有先验知识的情况下对微生物代谢进行建模
Python对txt进行读写操作
全文件读写 读操作使用pandas.read_csv,写操作使用data.to_csv。 import numpy import pandas as pd #读 data = pd.read_csv(r"/home/snowstorm/mmdetection/data/groundtruth.txt", header=None) #读取TXT:逗号分隔 #data = pd.read_csv(r"/home/snowstorm/mmdetection/data/groundtruth.txt", head
代码的路
2022/07/29
6890
Python对txt进行读写操作
原文链接 全文件读写 读操作使用pandas.read_csv,写操作使用data.to_csv。 import numpy import pandas as pd #读 data = pd.read_csv(r"/home/snowstorm/mmdetection/data/groundtruth.txt", header=None) #读取TXT:逗号分隔 #data = pd.read_csv(r"/home/snowstorm/mmdetection/data/groundtruth.txt"
代码的路
2022/07/26
6620
如何对图像进行卷积操作[通俗易懂]
2、卷积操作:卷积核与原图对应位置相乘再求和;然后将所求和放在被卷积操作的图中心位置。
全栈程序员站长
2022/08/26
3K0
如何对图像进行卷积操作[通俗易懂]
使用 PHP 函数对变量进行比较
使用 PHP 函数对变量 $x 进行比较 表达式 gettype() empty() is_null() isset() boolean : if($x) $x = ""; string TRUE FALSE TRUE FALSE $x = null; NULL TRUE TRUE FALSE FALSE var $x; NULL TRUE TRUE FALSE FALSE $x is undefined NULL TRUE TRUE FALSE FALSE $x = array(); array TRUE
Denis
2023/04/15
1.4K0
点击加载更多

相似问题

对非常相似的图像进行排序PHP OCR

20

如何对刻字进行OCR?

44

如何在Prolog中编写对列表进行操作的函数

313

在不编写执行该操作的函数的情况下对系列进行链式操作。

11

如何在没有编写器的情况下使用PHP-蒸汽社区

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档