首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >枚举多面体顶点位置、法线和纹理坐标GLSL的方法

枚举多面体顶点位置、法线和纹理坐标GLSL的方法
EN

Stack Overflow用户
提问于 2013-09-08 13:55:29
回答 1查看 166关注 0票数 0

我正在用WebGL渲染多面体,我想知道是否有一种更有效、更不容易出错的方法来生成顶点位置和法线。

理想情况下,我会向GPU发送一个只包含索引的缓冲区,并在顶点着色器中计算每个顶点的位置和法线。顶点着色器的外观如下所示:

代码语言:javascript
复制
uniform mat4 transform;

uniform ??? polyhedra; // some kind of representation of the polyhedra type    

attribute int index;

varying vec4 normal;
varying vec2 uv;

vec3 calculatePosition() { /* mathemagic w/index and polyhedra */ };
vec3 calculateNormal  () { /* mathemagic w/index and polyhedra */ };
vev2 calculateUV      () { /* mathemagic w/index and polyhedra */ };

void main() {
  gl_Position = transform * vec4(calculatePosition(), 1.0);
  normal      = transform * vec4(calculateNormal(), 1.0);
  uv          = calculateUV();
}

然后将顶点索引数组发送给index。对于使用平面着色的每个面两个三角形渲染的立方体(这很重要,因为这意味着顶点不能在不同的面之间共享,因为每个面的法线是不同的),我会发送一个索引缓冲区[0..36) (6个边*2个三角形*3个顶点)。

这是否有可能在没有英雄般的努力的情况下有效地实现?

WebGL本质上是OpenGL ES 2.0,因此没有几何体着色器。

EN

回答 1

Stack Overflow用户

发布于 2013-09-09 06:03:06

当然,这是可能的.然而,这可能并不实用。

不能生成顶点,但至少可以使用顶点着色器按程序使用值填充它们。一种方法可能是使用FBO并计算片段着色器中的位置,然后使用顶点着色器通过纹理查找获取位置/法线/uv。这是您能做的最好的事情,因为OpenGL ES 2.0缺乏转换反馈来持久地存储数据。

然而,如果你只生成这些多面体一次,就没有什么动力将负载转移到GPU上。WebGL可以在各种各样的设备上运行,其中一些设备的吞吐量比其他设备高。但在所有情况下,从顶点缓冲区读取顶点位置都比纹理查找快。如果WebGL有转换反馈,我可能会提出不同的建议,但这听起来像是巨大的时间浪费。

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

https://stackoverflow.com/questions/18680884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档