首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >OpenGL -索引缓冲困难

OpenGL -索引缓冲困难
EN

Stack Overflow用户
提问于 2014-04-28 10:56:27
回答 2查看 4.9K关注 0票数 3

我有一个定制的文件格式,它有一个3D网格所需的所有信息(从3ds Max导出)。我提取了顶点,顶点指数和法线的数据。

我将顶点数据、顶点索引和法线数据传递给OpenGL,并通过调用glDrawElements(GL_TRIANGLES,...)呈现网格。

一切看上去都是正常的除了正常值。问题是法线有不同的指数。因为OpenGL只能使用一个索引缓冲区,所以它对顶点和法线都使用该索引缓冲区。

如果你能建议我如何解决这个问题,我将非常感激。

需要注意的是,顶点/法线数据没有“排序”,因此我无法使用glDrawArrays(GL_TRIANGLES,...)的功能--网格不能正确呈现。

是否有一种方法/算法可以用来对数据进行排序,以便用glDrawArrays(GL_TRIANGLES,..)正确绘制网格?但是,即使有一个算法,还有一个问题--我将不得不复制一些顶点(因为我的顶点缓冲区由唯一的顶点组成--例如,如果您有多维数据集,我的缓冲区将只有8个顶点),而我不知道如何做到这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-01 04:28:33

我成功地做到了这一点,而没有用glDrawArrays(GL_TRIANGLES,..)将索引缓冲区传递给glDrawArrays(GL_TRIANGLES,..),我所做的是:填充一个顶点数组、顶点索引数组、法线数组和法线索引数组。然后,我用排序的数据创建了新的顶点和普通数组,并将它们传递给OpenGL。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for i = 0; i < vertexIndices.size(); ++i
    newVertexArray[i] = oldVertexArray[vertexIndices[i]];

for i = 0; i < normalsIndices.size(); ++i
    newNormalsArray[i] = oldNormalsArray[normalsIndices[i]];

我对它进行了一些优化,根本没有填充索引数组。但是优化取决于程序员读取网格数据的方式。

票数 -2
EN

Stack Overflow用户

发布于 2014-04-28 22:04:52

对顶点和法线使用单独索引的文件类型与OpenGL顶点模型不完全匹配。正如您注意到的,OpenGL使用一组索引。

您需要做的是为输入中的每个唯一(顶点索引、普通索引)对创建一个OpenGL顶点。这需要做一些工作,但并不困难,特别是在使用可用数据结构的情况下。一个STL map可以很好地工作,以(顶点索引,普通索引)对作为键。我不打算提供完整的C++代码,但我可以把它勾勒出来。

假设您已经将顶点读入某种数组/向量数据结构inVertices中,其中索引vertexIdx的顶点坐标存储在inVertices[vertexIdx]中。法线也是如此,其中带索引normalIdx的法线向量存储在inNormals[normalIdx]中。

现在,您可以读取一个三角形列表,每个三角形的每个角都由一个vertexIdx和一个normalIdx给出。我们将构建一个包含顶点和法线坐标的新combinedVertices数组/向量,以及一个新的combinedIndices索引列表。伪码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nextCombinedIdx = 0
indexMap = empty
loop over triangles in input file
    loop over 3 corners of triangle
        read vertexIdx and normalIdx for the corner
        if indexMap.contains(key(vertexIdx, normalIdx)) then
            combinedIdx = indexMap.get(key(vertexIdx, normalIdx))
        else
            combinedIdx = nextCombinedIdx
            indexMap.add(key(vertexIdx, normalIdx), combinedIdx)
            nextCombinedIdx = nextCombinedIdx + 1
            combinedVertices.add(inVertices[vertexIdx], inNormals[normalIdx])
        end if
        combinedIndices.add(combinedIdx)
    end loop
end loop
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23349080

复制
相关文章
用Nunit测试通讯程序
    对于Nunit,我是个纯粹的新手,没想到,第一个练手的,居然是一个通讯程序。难度略微大了点。我的通讯程序是一个类似通讯服务器的程序,能够监听和维持多个连接,并实现向任意连接的收发数据。因为原来实现过类似的东西,这次做的步子又前进了一些,把整个服务器的这种工作模式抽象出来了,做成了一个与具体业务无关的通讯层。我只是按照自己的想法把代码写了出来,上层还有很多逻辑层代码,如果在原来,就得等全套代码都好了,才能开始进行测试和修改。不过,现在我有Nunit,更准确的说,是有了Testdriven.Net,终于
用户1075292
2018/01/23
7660
C#中的单元测试
C#程序可以使用NUnit框架进行单元测试,NUnit是.NET语言的一个测试框架,和Java语言的JUnit同属于XUnit。
卡尔曼和玻尔兹曼谁曼
2019/01/25
2.2K0
.NET 基金会项目介绍-xUnit.net
xUnit.net 是属于 .Net 基金会的一个项目,本文将简要介绍该项目相关的信息。
newbe36524
2020/03/16
1.2K0
Jenkins之Nunit的应用
一、在Jenkins中安装Nunit插件 进入jenkins的插件管理模块,下载Nunit插件。此步骤不做截图说明 二、引用nunit.console的nuget包 通过项目引用Nunit.conso
sam dragon
2020/05/18
6870
Jenkins之Nunit的应用
Nunit使用心得
测试中,遇到问题,修改完后,无论当前在哪个位置,都可以用Repeat Test Run运行刚才的测试,很方便。 如果多个测试共用一个关键资源,如数据库的连接,监听服务器等,可以用[TestFixtureSetUp]定义一个全局的初始化处理。 测试的方法多种多样,不一定拘泥于比较大小,在某些并发环境下,可以采用其他的途径。比如,我测试通讯过程,测试本身只是一个死循环,睡眠一段时间,醒来就看看某些关键量是否达到要求。然后,定义一个时间(Timespan),以该变量在这个时间内是否达到要求作为测试的依据。 还有,
用户1075292
2018/01/23
5480
C# NUnit的安装
NUnit 是一个单元测试框架,专门针对于.NET来写的。NUnit是xUnit家族种的第4个主打产品,完全由C#语言来编写,并且编写时充分利用了许多.NET的特性,比如反射,客户属性等等。最重要的一点是它适合于所有.NET语言。
zls365
2021/03/16
1K0
Gallio 自动化测试平台
Gallio是MbUnit的作者组织开发的一个开源项目,非常值得从事测试开发的同学们的注意。 根据Gallio网站的描述:Gallio自动化平台是一个开放的,可扩展,和中立的系统,为.NET提供了一个公共的对象模型,运行时的服务和工具(例如测试运行器),在任何数量的测试框架中起协调作用。 Gallio平台的目标是促进建立一个丰富的社区和厂商所开发的大量的测试工具之间互操作的生态系统,以便处理比单个独立测试框架更广泛的测试需求。单元测试、集成测试、性能测试,甚至半自动化的测试都可以利用公共的基础设施。此外还需
张善友
2018/01/29
1.6K0
Mono 3.2 上跑NUnit测试
NUnit是一款堪与JUnit齐名的开源的回归测试框架,供.net开发人员做单元测试之用,可以从www.nunit.org网站上免费获得,最新版本是2.5。Mono 3.2 源码安装的,在/usr/bin/ 下面有2.4.8 版本: [azureuser@mono /]$ /usr/bin/nunit-console4 NUnit version 2.4.8 Copyright (C) 2002-2007 Charlie Poole. Copyright (C) 2002-2004 J
张善友
2018/01/19
6650
TestDriven.NET (2.7 Beta) 支持Silverlight/CoreCLR
Silverlight 1.1,在这个微软已经提供下载alpha版本中,包含了一个缩减版的CLR,还有最新发布的Dynamic Language Runtime (DLR)。Silverlight将被插入Internet Explorer、Mozilla和Safari浏览器中,这意味着缩减版的CLR也能够运行在这些平台上。 微软将这个缩减的CLR称为“Core CLR”(核心CLR)(这个核心CLR的代码代号是Tolesto,微软表示这恰巧是一个环绕土星的卫星的名字。)Core CLR将包含garbage
张善友
2018/01/30
5120
对比MS Test与NUnit Test框架
项目中进行Unit Test时,肯定会用到框架,因为这样能够更快捷、方便的进行测试。
跟着阿笨一起玩NET
2018/09/19
3.5K0
hash冲突以及hash冲突的解决方法
首先说一下hash冲突吧,hash冲突在hash表中一般情况下是会遇到的; hash冲突指的是你在向hash表中存数据时,首先要通过key值进行指定的hash算法进行计算,然后得到一个值,这个值就是你要将这个key对应的value存入的地址。但是在这个地址中已经有值存在,所以这个时候就发生了hash冲突,不同的key通过hash算法得到了对应的同一个值。
全栈程序员站长
2022/11/07
1.2K0
解决hash冲突的几种方法_hashmap hash冲突
hash函数 首先来说hash函数,java中对象都已一个hashCode() 方法,那为什么还需要hash函数呢?hashCode是在jdk中是有符号int类型,这个一个很大的范围,如果散列表的数组能覆盖所有int值的话,就不需要hash函数了,当然内存不允许我们维护这么大的散列表。这时我们需要hash函数将原始hashCode映射到一个很小的数组上去。 常见的做法是取模法,也是jdk中的实现方式。
全栈程序员站长
2022/09/28
8280
解决hash冲突的几种方法_hashmap hash冲突
.NET 基金会项目介绍-NUnit Test Framework
NUnit Test Framework 是属于 .Net 基金会的一个项目,本文将简要介绍该项目相关的信息。
newbe36524
2020/03/16
9510
JQuery的$命名冲突
在Jquery中,$是JQuery的别名,所有使用$的地方也都可以使用JQuery来替换,如$('#msg')等同于JQuery('#msg')的写法。然而,当我们引入多个js库后,在另外一个js库中也定义了$符号的话,那么我们在使用$符号时就发生了冲突。下面以引入两个库文件jquery.js和prototype.js为例来进行说明。  第一种情况:jquery.js在prototype.js之后进行引入,如:
阳光岛主
2019/02/19
1.3K0
hash冲突解决和javahash冲突解决
线性,平方显然很容被人猜出规律,所以最终是随机,那么是不是存在随机会出现取模的值相等的情况?
ydymz
2018/12/24
1.3K0
SVN冲突
svn在提交的时候断网极容易出现org.apache.subversion.javahl.ClientException: Attempted to lock an already-locked dir ------ "SVN 客户端异常:试图锁定一个已经锁定的目录"。
似水的流年
2019/12/08
5840
SVN冲突
svn在提交的时候断网极容易出现org.apache.subversion.javahl.ClientException: Attempted to lock an already-locked dir ------ "SVN 客户端异常:试图锁定一个已经锁定的目录"。       这是什么错误呢?根据提示能够想到,我要提交代码的时候,SVN 所做的工作中有一个操作步骤是"锁定",所以才会有"Attempted to lock "这一步,至于"an already-locked dir",我忽然想
似水的流年
2018/01/18
9340
SVN冲突
使用NUnit在.Net编程中进行单元测试
原文地址:http://www.microsoft.com/china/community/Column/59.mspx 引言: 举一个可能会发生在你身边的事件将更能贴近实际,幸好我们现在就有一件在程序员看来非常普通的任务: 你今天第一天上班,你的项目经理拿给你一叠不算厚的文档,告诉你今天的任务是按照文档中的要求编写一个.Net类,可能因为任务并不复杂,所以他看上去非常的随意。 今天能否很好的完成任务对你来说非常特殊,你拿过来后快速略过了前面大段的项目介绍,因为你知道那些对你并不重要,印象中
菩提树下的杨过
2018/01/22
1.7K0
冲突域
先说人话:多N台计算机使连接在同一个集线器设备中,并同时往集线器发送数据要通过这个设备出去,但是这个设备同一时间内只能发送一个计算机的数据,所以会产生冲突。(便宜货就是问题多)
潇洒
2023/10/20
2010
#PY小贴士# git 的冲突
为什么我的 git 在 pull 更新线上最新代码的时候提示失败,然后发现代码里多了一些奇怪的内容:
Crossin先生
2020/01/16
3290
#PY小贴士# git 的冲突

相似问题

Testdriven.Net和NUnit异常

12

NUnit,TestDriven.Net:使用部分测试类复制测试结果

11

TestDriven.Net nunit.framework错误

30

NUnit、TestDriven.NET、WatiN和Specflow

13

.net 4中存在testdriven.net问题的nunit

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文