glDrawArrays和glVertexAttrib指针

ghhaqwfi  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(148)

我正在尝试学习OpenGL和GLSL。我正在尝试绘制一个导入的模型,它存储在三个数组中(顶点-array of TVector3,这是一个记录/结构体,带有X,Y,Z:单/浮动;法线-array of TVector3;这个模型绘制得很好,没有使用着色器,也没有使用旧的调用,glNormalglVertex。我切换到glDrawArrays,因为所有东西都被弃用,并尝试使用着色器,glTexCoordPointer不起作用,因为layout (location = 2)包含不正确的UVMap或根本没有(纹理仍然存在,因为网格被着色了),而glTexCoordPointer根本没有影响它。但是,当尝试使用this tutorial上的glVertexAttribPointer方法时,什么也没有画出来。我将三个数组转换为一个array of single,但仍然没有用。尝试使用glDrawElements会导致SIGSEGV,因为我没有提供索引(而且我读到它比glDrawArrays慢)。
我迷路了,我做错了什么吗?也许我遗漏了什么?有没有什么方法可以传递TVectorX数组而不将它们合并成一个?
我的代码(Object Pascal,OpenGL 4.3):

type
  TVector2 = record
    public
      X, Y: single;
      {...}
  end;  
  TVector3 = record
    private                                     
      {...}
    public
      X, Y, Z: single; 
      {...}
  end;

var
  MeshArray: array of single;  
  VertexArray, VertexBuffer: longword;    

{Mesh initialization code:}

SetLength(MeshArray, Length(Vertices)*8);
for i:=1 to Length(Vertices) do begin
  j := (i-1)*8;
  MeshArray[ j ] := Vertices[i-1].X;
  MeshArray[j+1] := Vertices[i-1].Y;
  MeshArray[j+2] := Vertices[i-1].Z;
  MeshArray[j+3] := Normals[i-1].X;
  MeshArray[j+4] := Normals[i-1].Y;
  MeshArray[j+5] := Normals[i-1].Z;
  MeshArray[j+6] := UVs[i-1].X;
  MeshArray[j+7] := UVs[i-1].Y;
end;
glGenVertexArrays(1, @VertexArray);
glGenBuffers(1, @VertexBuffer);

glBindVertexArray(VertexArray);

glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer);
glBufferData(GL_ARRAY_BUFFER, SizeOf(MeshArray), @MeshArray, GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, SizeOf(single) * 8, PChar(0));
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, SizeOf(single) * 8, PChar(3 * SizeOf(single)));
glEnableVertexAttribArray(1);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, SizeOf(single) * 8, PChar(6 * SizeOf(single)));
glEnableVertexAttribArray(2);  

{Drawing code:}

glActiveTexture(GL_TEXTURE0);  //Not necessary
glBindTexture(GL_TEXTURE_2D, mat.Albedo.Data); 

glUseProgram(mat.ShaderProgram);
//Draws model correctly, but without UV when using glVertexPointer(3, GL_FLOAT, 0, @Vertices[0]);

glBindVertexArray(VertexArray);      
glDrawArrays(GL_TRIANGLES, 0, Length(Vertices));

顶点着色器(MatVertex只是对象和摄影机矩阵):


# version 430 core

layout (location = 0) in vec3 Vertex;
layout (location = 1) in vec3 Normal;
layout (location = 2) in vec2 UV;

out vec3 outVertex;
out vec3 outNormal;
out vec2 outUV;

uniform mat4 MatVertex;

void main(){
    gl_Position = vec4(Vertex, 1.0) * MatVertex;
    outVertex = Vertex;
    outNormal = Normal;
    outUV = UV;
}

片段着色器:


# version 430 core

in vec3 outVertex;
in vec3 outNormal;
in vec2 outUV;

out vec3 color;

uniform sampler2D albedoTex;

void main(){
    color = texture(albedoTex, outUV).rgb;
}

sycxhyv7

sycxhyv71#

向量需要从紧的矩阵乘到(见GLSL Programming/Vector and Matrix Operations):
gl_Position = vec4(Vertex, 1.0) * MatVertex;

gl_Position = MatVertex * vec4(Vertex, 1.0);

相关问题