我正在使用openGL ES编写一个Android应用程序.我遵循了一些在线教程并设法使用硬编码顶点/索引/纹理坐标加载纹理立方体
作为下一步,我为wavefront .obj文件编写了一个解析器.我使用教程中的顶点等制作了一个模拟文件,加载很好.
但是,当我使用使用3d建模包制作的文件时,所有纹理都会混乱
下面是我目前获取纹理坐标的方式:
首先,我将所有纹理坐标加载vt到一个大向量中
接下来我找到每个f三角形的前两个纹理坐标(所以f 1/2/3 2/5/2 3/4/1意味着我采用第2和第5纹理坐标.因为.obj从1开始计数而不是0,我从位置开始必须为-1,然后将位置乘以2作为x坐标位置,并对我的vt数组中的y坐标位置执行相同但+1
我采用刚刚找到的那些纹理坐标并将它们添加到另一个矢量中.
一旦我完成了所有顶点.我将矢量转换为FloatBuffer,将其传递给glTexCoordPointer我的draw方法
这是解析文件的代码:
private void openObjFile(String filename, Context context, GL10 gl){
Vector<String> lines = openFile(filename, context); // opens the file
Vector<String[]> tokens = new Vector<String[]>();
Vector<Float> vertices = new Vector<Float>();
Vector<Float> textureCoordinates = new Vector<Float>();
Vector<Float> vertexNormals = new Vector<Float>();
// tokenise
for(int i = 0;i<lines.size();i++){
String line = lines.get(i);
tokens.add(line.split(" "));
}
for(int j = 0;j<tokens.size();j++){
String[] linetokens = tokens.get(j); …Run Code Online (Sandbox Code Playgroud) 我正在完成一个波前对象解析器,我想用它来构造泛型网格对象.我的引擎使用OpenGL 4和着色器绘制引擎中的所有内容.
我的问题是如何确保渲染网格的最佳渲染效率.
甲波前obj文件通常具有指定的许多对象的子组.
可以为子组分配特定材料(例如闪亮的红色).
因此,网格可能是一个相当复杂的子组集合,每个子组都分配了自己的材料.
我的问题是 -
问:我是否需要单独绘制每个子组,例如每个子组调用glDrawElements?(所以,如果我有4个独立的子组,我必须进行四次glDrawElements调用,从而通过4次统一更改(对于材质/纹理)调用着色器4次)
glDrawElements( GL_TRIANGLES, nNumIndicesInGroup, GL_UNSIGNED_INT, ((char*)NULL)+ first-vertex-offset );
Run Code Online (Sandbox Code Playgroud)
如果这是正确的,那么我将不得不计算:
每个子组中的索引(表示每个子组的单独索引数组和VAO)子组开始的顶点偏移量
这看起来非常低效,我咆哮错了树吗?
另外,从Wavefront obj wiki页面:
Smooth shading across polygons is enabled by smoothing groups.
s 1
...
# Smooth shading can be disabled as well.
s off
...
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议平滑阴影值表示什么?例如s1,s2,s4等
我正在一个项目中,我们需要即时将.OBJ模型转换为.G3DJ(JSON)格式。我已经尝试过在Google代码中建立的这段代码。
https://code.google.com/p/libgdx-users/wiki/ImportingModelsFromBlender
ObjLoader loader = new ObjLoader();
StillModel model = loader.loadObj(Gdx.files.internal("data/model.obj"), true);
G3dExporter.export(models, Gdx.files.absolute("data/model.g3d"));
Run Code Online (Sandbox Code Playgroud)
但是,StillModel和G3DExporter不能在libgdx找到。
有任何想法吗?
我从blender导出一个.obj加载到一个C++程序我正在编写一切都很好但是我想知道在解析面部时我注意到面部数据中第三个点上有一个未使用的纹理坐标.
f 1/1 2/2 3/3
//f 1/s 2/t 3/? Its vt3 that is the coordinate in question
Run Code Online (Sandbox Code Playgroud)
这是用来做什么的?我应该保留它吗?
我已经把自己的OBJ解析器/导入器支持添加到我一直在研究的3D渲染引擎上.我遵循了这里发现的几乎'发球' 的规格,目前的例外是限制对组,面,顶点,法线和纹理坐标的所有支持(因此没有材料库或自由形式的多边形支持) .我的目标是简单地逐行解析 - 在我进行时生成面向对象的,分层的树状场景图 - 并允许开发人员自动将数据绑定到着色器程序,只需很少的手动调用,以便开始操纵和查看网格.最终结果是我的引擎成功解析了大多数(如果不是全部)有效的OBJ格式文件,提取了适当的数据并将其发送到基本着色器进行渲染.但是,即使数据似乎在场景图中正确表示,由于某种原因它很少正确渲染...
请注意,一个简单的平面(从3DS Max导出,只包含4个顶点和2个面)渲染完美,但是立方体或任何更高级的平面通常最终看起来像这样:
我不知道出了什么问题,AFAIK我的代码实际上应该解析并渲染基本的几何图形......那么为什么不呢?为方便起见,我在这里上传了我的项目.它包含一个NetBeans项目,其中包含我的引擎的最小版本和一个Test应用程序.我还包括3个不同版本的OBJ立方体网格和一个平面网格.可以通过编辑Test.java顶部的值来配置应用程序,并且唯一的输入控件是用于网格平移的A,S,W和D,以及用于网格旋转的鼠标移动.虽然我已经设法大幅度减少了项目,但最值得注意的类包括文件顶部的额外注释/信息.
考虑到所有事情,我会采取任何我能得到的想法......而且肯定不会不受重视!
今天,我开始实现波前 obj 加载器,问题是我不知道为什么互联网上有这么多包含 4 个顶点的 obj 文件,尽管事实上 OpenGL 不再支持 GL_QUADS 并弃用它。
有什么解决方法吗?我的意思是,每次我尝试使用 GL_TRIANGLE_FAN 或 GL_TRIANGLE_STRIP 绘制包含 4 个顶点的面时,它都会显示悲惨的结果。所以最后我别无选择,只能在每个面上发出绘制命令,正如你所知,它表现出糟糕的表现。我想绘制它只在每个组或平滑组上发出一个命令。
有任何想法吗?
我想了解 OBJ 格式如何处理纹理坐标。
例子:
vt 1.000000 1.005200
vt 0.467300 1.709900
vt 0.923800 1.994400
vt 0.500000 1.002600
vt 0.371400 1.000000
vt 0.438100 2.000000
vt 0.000000 1.000000
vt 0.467300 1.709900
vt 0.105000 1.159500
vt 0.434600 1.002300
Run Code Online (Sandbox Code Playgroud)
我理解值的范围应从 (0) 到 (1.000000) 以覆盖每个 X 和 Y 的 0% 到 100% 的纹理图像文件。(tu tv)
但我发现数组中的某些值高于 1.000000,有时低于 0.000000
我应该如何处理这些值以保持在 0 和 1 之间?
我对 OpenGL 比较陌生,正在将它用于需要我将它与 C 一起使用的类(没有 C++)。我想在我的代码中使用 .obj 文件,但不知道如何导入它们。我在网上找到了很多 C++ 的导入器,但必须使用 C。任何人都可以将我引导到导入器或给我一些关于如何编写我自己的/处理和导入 .obj 文件到我的程序的基础知识。谢谢!
我是 PYopenGL 的新手,实际上,我也不确定 PYopenGL 是否适合我的任务。
我有一个 Wavefront obj 文件格式的 3D 模型。我需要从给定的视图中获取模型的“打印屏幕”。换句话说,我需要渲染模型而不是显示模型将其保存为图像(jpg)
我的想法是使用 PYopenGL 来完成这项任务。但是,谷歌搜索我找不到如何做到这一点的建议或示例。因此,我开始怀疑 PYopenGL 是否适合我的任务。
你们中有人已经有了这样的东西,或者知道一个我可以用来学习的例子吗?
提前致谢。
道