我正在尝试学习OpenGL和GLSL。我正在尝试绘制一个导入的模型,它存储在三个数组中(顶点-array of TVector3
,这是一个记录/结构体,带有X,Y,Z:单/浮动;法线-array of TVector3
;这个模型绘制得很好,没有使用着色器,也没有使用旧的调用,glNormal
和glVertex
。我切换到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;
}
1条答案
按热度按时间sycxhyv71#
向量需要从紧的矩阵乘到(见GLSL Programming/Vector and Matrix Operations):
gl_Position = vec4(Vertex, 1.0) * MatVertex;