我正在关注一些初学者OpenGL教程,对这段代码感到有些困惑:
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject); //Bind GL_ARRAY_BUFFER to our handle
glEnableVertexAttribArray(0); //?
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); //Information about the array, 3 points for each vertex, using the float type, don't normalize, no stepping, and an offset of 0. I don't know what the first parameter does however, and how does this function know which array to deal with (does it always assume we're talking about GL_ARRAY_BUFFER?
glDrawArrays(GL_POINTS, 0, 1); //Draw the vertices, once again how does this know which vertices …
Run Code Online (Sandbox Code Playgroud) 我试图清楚地知道何时应该使用带有gl [Multi] DrawElements等绘制的OpenGL顶点的索引数组,而不是我应该简单地使用连续的顶点数组,用gl [Multi] DrawArrays绘制.
(更新:我得到的回复中的共识是,应该始终使用索引顶点.)
我已经多次在这个问题上来回走动了,所以我将概述我目前的理解,希望有人可以告诉我,我现在终于或多或少正确,或者指出我遗留的误解在哪里.具体来说,我有三个结论,粗体.如果错误请纠正.
一个简单的例子是如果我的几何体由网格组成以形成曲面.在这种情况下,网格中间的顶点对于使用顶点的每个三角形将具有相同的属性(位置,法线,颜色,纹理坐标等).
这使我得出结论:
对于接缝很少的几何体,索引数组是一个巨大的胜利.
始终遵循规则1,除了:
对于非常"块状"的几何体,其中每个边都代表一个接缝,索引数组的好处不那么明显.以一个简单的立方体为例,虽然每个顶点用于三个不同的面,但我们不能在它们之间共享顶点,因为对于单个顶点,表面法线(以及可能的其他东西,如颜色和纹理合作) )每张脸都会有所不同.因此,我们需要在我们的数组中明确引入冗余顶点位置,以便可以使用不同的法线等多次使用相同的位置.这意味着索引数组的使用较少.
例如,渲染立方体的单个面时:
0 1
o---o
|\ |
| \ |
| \|
o---o
3 2
Run Code Online (Sandbox Code Playgroud)
(这可以单独考虑,因为这个面和所有相邻面之间的接缝意味着这些顶点之间不能共享这些顶点)
如果使用GL_TRIANGLE_FAN(或_STRIP)进行渲染,则可以渲染立方体的每个面:
verts = [v0, v1, v2, v3]
colors = [c0, c0, c0, c0]
normal = [n0, n0, n0, n0]
Run Code Online (Sandbox Code Playgroud)
添加索引不允许我们简化此操作.
由此我得出结论:
2.当渲染所有接缝或大多数接缝的几何体时,当使用GL_TRIANGLE_STRIP或_FAN时,我应该永远不要使用索引数组,而应该总是使用gl [Multi] DrawArrays.
(更新:回复表明这个结论是错误的.即使索引不允许我们在这里减小数组的大小,仍然应该使用它们,因为其他性能优势,如评论中所讨论的)
规则2的唯一例外是:
当使用GL_TRIANGLES(而不是条带或扇形)时,一半的顶点仍然可以重复使用两次,具有相同的法线和颜色等,因为每个立方体面都呈现为两个独立的三角形.同样,对于相同的单个立方体面:
0 1
o---o
|\ |
| \ |
| \|
o---o
3 2
Run Code Online (Sandbox Code Playgroud)
没有索引,使用GL_TRIANGLES,数组将是这样的:
verts = [v0, v1, v2, v2, v3, …
Run Code Online (Sandbox Code Playgroud) 节点和顶点之间有什么区别(如果有的话)?看完无数的网站后我找不到答案!甚至我的书都没有指明它所以我有点迷茫!
值得一提的是,除了在图形中使用它被称为"顶点"而在树中使用时称为"节点"这一事实时,我正在寻找差异.
我想创建一个深度优先搜索,我有点成功.
这是我到目前为止的代码(除了我的构造函数,请注意Vertex和Edge类只包含属性,这里没有重要的内容):
private Stack<Vertex> workerStack = new Stack<Vertex>();
private List<Vertex> vertices = new List<Vertex>();
private List<Edge> edges = new List<Edge>();
private int numberOfVertices;
private int numberOfClosedVertices;
private int visitNumber = 1;
private void StartSearch()
{
// Make sure to visit all vertices
while (numberOfClosedVertices < numberOfVertices && workerStack.Count > 0)
{
// Get top element in stack and mark it as visited
Vertex workingVertex = workerStack.Pop();
workingVertex.State = State.Visited;
workingVertex.VisitNumber = visitNumber;
visitNumber++;
numberOfClosedVertices++;
// Get all edges connected to …
Run Code Online (Sandbox Code Playgroud) 好的,
我是3D图形的新手,我想在模型中为各个特定顶点设置动画(不是整个模型变换).我的脚本主要基于NEHE webgl教程.在本教程中,所有对象顶点都存储在缓冲区中,该缓冲区在首次运行程序时初始化一次.这是初始化代码:*注意顶点包含顶点数组
vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
vertexBuffer.itemSize = 3;
vertexBuffer.numItems = parseInt(vertices.length/vertexBuffer.itemSize);
Run Code Online (Sandbox Code Playgroud)
现在因为它们在开始时被初始化,显然改变顶点数组将不起作用.所以我想知道如何实时修改顶点的最佳方法,同时仍保持其足够高效以便顺利运行.
是否有可能以某种方式重新绑定缓冲区,例如在每个动画时刻再次运行此代码?
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
Run Code Online (Sandbox Code Playgroud)
干杯,J
每当我们使用索引数组渲染带有glDraw*Elements*的纹理多边形时,我们就可以提供一个顶点数组和一个纹理坐标数组.然后索引数组中的每个索引引用顶点数组中某个位置的顶点和纹理数组中相同位置的相应纹理坐标.现在,如果例如几个单独的基元(如QUADS)共享一个顶点,但需要该顶点的不同纹理坐标,我们必须在数组中复制该顶点多次,因为我们有不同的纹理坐标.因此,如果纹理坐标数组可以与索引数组中的位置相关联,则会更方便.这样,将一个特定顶点与不同纹理坐标相关联就不需要顶点重复.
这可能吗?如果是,使用什么语法?
我一直在用OpenGL编写程序.最近,我开始学习OpenGL着色语言.我是新手; 所以请详细说明你的答案.
我的问题是:
我只熟悉从"顶点着色器"传递到"片段着色器"以在顶点之间进行插值的"变化"变量.除此之外,我什么都不知道.
我有一个顶点着色器,它接受以下属性:
a_posCoord
:顶点位置a_texCoord
:纹理坐标(传递给片段着色器)a_alpha
:透明度因子(传递给片段着色器)我正在渲染的对象都是"广告牌"(一对直角三角形来制作一个矩形).
我正在使用单个调用来glDrawArrays
渲染许多广告牌,每个广告牌都可能具有唯一的alpha值.单个广告牌有6个顶点.这里有一些伪代码来说明我如何为单个广告牌组织顶点属性缓冲区:
vertexAttributes = [
px1,py1,pz1, // vertex 1: a_posCoord
tx1,ty1, // vertex 1: a_texCoord
alpha, // vertex 1: a_alpha
px2,py2,pz2, // vertex 2: a_posCoord
tx2,ty2, // vertex 2: a_texCoord
alpha, // vertex 2: a_alpha
px3,py3,pz3, // vertex 3: a_posCoord
tx3,ty3, // vertex 3: a_texCoord
alpha, // vertex 3: a_alpha
px4,py4,pz4, // vertex 4: a_posCoord
tx4,ty4, // vertex 4: a_texCoord
alpha, // vertex 4: a_alpha
px5,py5,pz5, // vertex 5: …
Run Code Online (Sandbox Code Playgroud) 我正在尝试学习如何编写顶点着色器.在Apple的示例项目中,他们有一条线来设置
glUniform1f(uniforms[UNIFORM_TRANSLATE], (Glfloat)transY);
Run Code Online (Sandbox Code Playgroud)
然后使用此值
// value passt in f
// glUniform1f(uniforms[UNIFORM_TRANSLATE](Glfloat)transY);
uniform float translate;
void main()
{
gl_Position.y+=sin( translate);
…
Run Code Online (Sandbox Code Playgroud)
我无法找到所有制服的所有制服的清单.
有没有人知道我在哪里可以找到所有制服的清单和一本关于学习如何编程顶点着色器的好书或教程.
我想从网格红色,蓝色和绿色设置三角形的每个三个顶点.
如本教程的第一部分所示,该教程适用于另一种语言.这是他们用来为网格中每个三角形中的每个椎骨设置红色,绿色和蓝色的代码:
function set_wireframe_colors(m)
local cc = {}
for i = 1, m.size/3 do
table.insert(cc, color(255,0,0))
table.insert(cc, color(0,255,0))
table.insert(cc, color(0,0,255))
end
m.colors = cc
end
Run Code Online (Sandbox Code Playgroud)
这就是使用简单的顶点颜色着色器输出的样子:
我尝试在Unity中使用C#重新创建相同的东西,但我正在努力学习本教程的第一部分.
这是我的代码:
void Start()
{
Mesh mesh = GetComponent<MeshFilter>().mesh;
Vector3[] vertices = mesh.vertices;
//Create new colors array where the colors will be created.
Color32[] colors = new Color32[vertices.Length];
for (int i = 0; i < vertices.Length; i += 3)
{
colors[i] = new Color32(255, 0, 0, 255);
colors[i + 1] …
Run Code Online (Sandbox Code Playgroud)