呼叫 glDrawElements() 時出現錯誤,我不知道為什么:/我是使用 OpenGL 的新手,我正在嘗試了解它是如何作業的。
注意:我正在使用這個庫將 OBJ 檔案轉換為 OpenGL 應該能夠使用的陣列:https ://github.com/korre/java-obj-to-opengl/blob/master/MeshObjectLoader.java
public class Mesh {
private int vaoId;
private List<Integer> vboIdList = new ArrayList<>();
@Getter
@Setter
private float scale = 1;
@Getter
@Setter
private Vector3f position = new Vector3f(0, 0, 0);
@Getter
@Setter
private Vector3f rotation = new Vector3f(0, 0, 0);
@Getter
@Setter
private String textureKey;
private int vertexCount;
private Mesh(MeshObjectLoader.MeshArrays meshArrays) {
vaoId = glGenVertexArrays();
glBindVertexArray(vaoId);
var vboId = 0;
vertexCount = meshArrays.getNumVertices();
// Load vertices
vboId = glGenBuffers();
vboIdList.add(vboId);
var vertexBuffer = (FloatBuffer) meshArrays.getVertices();
glBindBuffer(GL_ARRAY_BUFFER, vboId);
glBufferData(GL_ARRAY_BUFFER, vertexBuffer, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, false, 0 ,0);
// Load texture coordinates
vboId = glGenBuffers();
vboIdList.add(vboId);
var textureCoordsBuffer = (FloatBuffer) meshArrays.getTexCoords();
glBindBuffer(GL_ARRAY_BUFFER, vboId);
glBufferData(GL_ARRAY_BUFFER, textureCoordsBuffer, GL_STATIC_DRAW);
glVertexAttribPointer(1, 2, GL_FLOAT, false, 0, 0);
// Clean everything up
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
public static Mesh loadFromObjFile(String resourcePath) throws IOException {
try (var resourceStream = Mesh.class.getResourceAsStream(resourcePath)) {
return new Mesh(MeshObjectLoader.loadModelMeshFromStream(resourceStream));
}
}
public void render(int textureId) {
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureId);
glBindVertexArray(vaoId);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnable(GL_DEPTH_TEST);
glDrawElements(GL_TRIANGLES, vertexCount, GL_UNSIGNED_INT, 0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glBindVertexArray(0);
}
public void cleanup() {
glDisableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
for (int vboId : vboIdList) {
glDeleteBuffers(vboId);
}
glBindVertexArray(0);
glDeleteVertexArrays(vaoId);
}
}
uj5u.com熱心網友回復:
崩潰的原因是您從未將緩沖區物件GL_ELEMENT_ARRAY_BUFFER系結到 VAO 的系結點,因此最后一個引數glDrawElements(..., 0)被解釋為主機地址指標,而不是任何元素陣列緩沖區中的位元組偏移量。當然,取消參考0地址會失敗。
每當您呼叫索引繪制呼叫時,glDrawElements您還需要一個元素陣列緩沖區(也稱為“索引緩沖區”)。
該庫以這樣一種方式回傳位置、紋理坐標和法線串列,您只需要通過glDrawArrays(). 這也是 Wavefront OBJ 加載器的典型特征,因為 Wavefront OBJ 格式具有用于位置、法線和紋理坐標的單獨索引,因此典型的加載無論如何都會對所有面部索引進行交叉乘積,并為您提供線性/重復頂點資料串列。
所以:glDrawArrays改為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/464510.html
上一篇:創建物件時如何在類中設定默認值
