Java OpenGL只显示12个三角形中的3个
我正在尝试学习现代OpenGL,使用OpenGL Superbibel(第6版)。因为我的主要编程语言是java,所以我使用jogl 我有一个问题,显示一个旋转立方体,12个三角形中只有3个显示。每次列表的前3个顶点(如果我注释掉一些顶点,将使用下一个顶点) 主要问题: 为什么12个三角形中只显示3个? 结果是这样的: 顶点着色器:Java OpenGL只显示12个三角形中的3个,java,opengl,3d,jogl,Java,Opengl,3d,Jogl,我正在尝试学习现代OpenGL,使用OpenGL Superbibel(第6版)。因为我的主要编程语言是java,所以我使用jogl 我有一个问题,显示一个旋转立方体,12个三角形中只有3个显示。每次列表的前3个顶点(如果我注释掉一些顶点,将使用下一个顶点) 主要问题: 为什么12个三角形中只显示3个? 结果是这样的: 顶点着色器: #version 420 core layout (location = 1) in vec4 position; out VS_OUT{ vec4
#version 420 core
layout (location = 1) in vec4 position;
out VS_OUT{
vec4 color;
} vs_out;
uniform mat4 mv_matrix;
uniform mat4 proj_matrix;
void main(void){
gl_Position = proj_matrix * mv_matrix * position;
vs_out.color = position * 2.0 + vec4(0.5, 0.5, 0.5, 0.0);
}
片段着色器:
#version 420 core
out vec4 color;
in VS_OUT{
vec4 color;
} fs_in;
void main(void){
color = fs_in.color;
}
Java代码:
(从init方法内的应用程序类调用startup,在display方法内调用render)
public类listing9扩展了GLApplication{
私有int[]缓冲区=新int[1];
浮动方向=0.0f;
浮动[]项目矩阵=新浮动[16];
int mv_位置;
国际项目地点;
浮子st=0.001f;
公开上市9(){
超级();
}
@凌驾
受保护的空心渲染(GL4 GL4,浮动时间){
时间=st;
gl4.glViewport(0,0,GLApplication.windowSize.width,GLApplication.windowSize.height);
gl4.glClearColor(0.0f、0.25f、0.0f、1.0f);
gl4.glClearDepthf(1.0f);
gl4.glClear(GL.GL_颜色_缓冲_位| GL.GL_深度_缓冲_位);
gl4.glUseProgram(程序);
gl4.glUniformMatrix4fv(proj_位置,1,false,proj_矩阵,0);
浮动f=(浮动)时间*0.3f;
Matrix4 mv_矩阵=新Matrix4();
mv_矩阵平移(0.0f,0.0f,-20.0f);
mv_矩阵平移((浮点)数学sin(2.1f*f)*0.5f,
(浮动)数学cos(1.7f*f)*0.5f,
(浮动)(数学sin(1.3f*f)*数学cos(1.5f*f))*2.0f);
mv_矩阵旋转((浮动)时间*45.0f、0.0f、1.0f、0.0f);
mv_矩阵旋转((浮动)时间*81.0f、1.0f、0.0f、0.0f);
gl4.glUniformMatrix4fv(mv_location,1,false,mv_matrix.getMatrix(),0);
gl4.glDrawArray(GL.GL_三角形,0,36);
检查错误(gl4,“显示”);
}
@凌驾
受保护的无效启动(GL4 GL4){
program=loadProgram(gl4,新字符串[]{“l9vs”,“l9fs”},新int[]{
GL4.GL_顶点_着色器,GL4.GL_片段_着色器});
mv_位置=gl4.glGetUniformLocation(程序,“mv_矩阵”);
proj_location=gl4.glGetUniformLocation(程序,“proj_矩阵”);
系统输出打印项次(“MV:+MV_位置);
系统输出打印项次(“项目:+项目位置);
gl4.glgenvertexarray(1,objects,Semantic.Object.VAO);
gl4.glBindVertexArray(objects[Semantic.Object.VAO]);
浮动顶点_位置[]={
-0.25f,0.25f,-0.25f,
-0.25f,-0.25f,-0.25f,
0.25f,-0.25f,-0.25f,
0.25f,-0.25f,-0.25f,
0.25f,0.25f,-0.25f,
-0.25f,0.25f,-0.25f,
0.25f,-0.25f,-0.25f,
0.25f,-0.25f,0.25f,
0.25f,0.25f,-0.25f,
0.25f,-0.25f,0.25f,
0.25f,0.25f,0.25f,
0.25f,0.25f,-0.25f,
0.25f,-0.25f,0.25f,
-0.25f,-0.25f,0.25f,
0.25f,0.25f,0.25f,
-0.25f,-0.25f,0.25f,
-0.25f,0.25f,0.25f,
0.25f,0.25f,0.25f,
-0.25f,-0.25f,0.25f,
-0.25f,-0.25f,-0.25f,
-0.25f,0.25f,0.25f,
-0.25f,-0.25f,-0.25f,
-0.25f,0.25f,-0.25f,
-0.25f,0.25f,0.25f,
-0.25f,-0.25f,0.25f,
0.25f,-0.25f,0.25f,
0.25f,-0.25f,-0.25f,
0.25f,-0.25f,-0.25f,
-0.25f,-0.25f,-0.25f,
-0.25f,-0.25f,0.25f,
-0.25f,0.25f,-0.25f,
0.25f,0.25f,-0.25f,
0.25f,0.25f,0.25f,
0.25f,0.25f,0.25f,
-0.25f,0.25f,0.25f,
-0.25f,0.25f,-0.25f};
gl4.glGenBuffers(1,buffer,0);
gl4.glBindBuffer(GL.GL_数组_BUFFER,BUFFER[0]);
gl4.glBufferData(GL.GL_数组_缓冲区,
顶点位置。长度,
FloatBuffer.wrap(顶点位置),
总帐、总帐(静态图);
gl4.glvertexattributepointer(1,3,GL.GL_FLOAT,false,0,0);
gl4.GlenableVertexAttributeArray(1);
//gl4.glEnable(GL.Glu CULL_面);
gl4.glFrontFace(GL.GL_-CW);
gl4.glEnable(GL.Glu深度测试);
gl4.glDepthFunc(GL.GL_LEQUAL);
}
@凌驾
受保护的无效关机(GL4 GL4){
gl4.glDeleteProgram(program);
gl4.gldeleteVertexArray(1,对象,对象[Semantic.Object.VAO]);
}
@凌驾
受保护的void onResize(GL4 GL4,int w,int h){
纵横比=w/h;
proj_矩阵=FloatUtil.makePerspective(proj_矩阵,
0,
是的,
50.0f,
方面,,
0.1f,
1000.0华氏度);
}
专用整数加载程序(GL4 gl,字符串[]名称,整数[]类型){
ShaderProgram ShaderProgram=新ShaderProgram();
for(int i=0;i
您对glBufferDatapublic class Listening9 extends GLApplication {
private int[] buffer = new int[1];
float aspect = 0.0f;
float[] proj_matrix = new float[16];
int mv_location;
int proj_location;
float st = 0.001f;
public Listening9() {
super();
}
@Override
protected void render(GL4 gl4, float time) {
time = st;
gl4.glViewport(0, 0, GLApplication.windowSize.width, GLApplication.windowSize.height);
gl4.glClearColor(0.0f, 0.25f, 0.0f, 1.0f);
gl4.glClearDepthf(1.0f);
gl4.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
gl4.glUseProgram(program);
gl4.glUniformMatrix4fv(proj_location, 1, false, proj_matrix, 0);
float f = (float)time * 0.3f;
Matrix4 mv_matrix = new Matrix4();
mv_matrix.translate(0.0f, 0.0f, -20.0f);
mv_matrix.translate((float)Math.sin(2.1f * f) * 0.5f,
(float)Math.cos(1.7f * f) * 0.5f,
(float)( Math.sin(1.3f * f) * Math.cos(1.5f * f)) * 2.0f);
mv_matrix.rotate((float)time * 45.0f, 0.0f, 1.0f, 0.0f);
mv_matrix.rotate((float)time * 81.0f, 1.0f, 0.0f, 0.0f);
gl4.glUniformMatrix4fv(mv_location, 1, false, mv_matrix.getMatrix(), 0);
gl4.glDrawArrays(GL.GL_TRIANGLES, 0, 36);
checkError(gl4, "display");
}
@Override
protected void startup(GL4 gl4) {
program = loadProgram(gl4, new String[] { "l9vs", "l9fs" }, new int[] {
GL4.GL_VERTEX_SHADER, GL4.GL_FRAGMENT_SHADER });
mv_location = gl4.glGetUniformLocation(program, "mv_matrix");
proj_location = gl4.glGetUniformLocation(program, "proj_matrix");
System.out.println("MV: "+mv_location);
System.out.println("Proj: "+proj_location);
gl4.glGenVertexArrays(1, objects, Semantic.Object.VAO);
gl4.glBindVertexArray(objects[Semantic.Object.VAO]);
float vertex_positions[] = {
-0.25f, 0.25f, -0.25f,
-0.25f, -0.25f, -0.25f,
0.25f, -0.25f, -0.25f,
0.25f, -0.25f, -0.25f,
0.25f, 0.25f, -0.25f,
-0.25f, 0.25f, -0.25f,
0.25f, -0.25f, -0.25f,
0.25f, -0.25f, 0.25f,
0.25f, 0.25f, -0.25f,
0.25f, -0.25f, 0.25f,
0.25f, 0.25f, 0.25f,
0.25f, 0.25f, -0.25f,
0.25f, -0.25f, 0.25f,
-0.25f, -0.25f, 0.25f,
0.25f, 0.25f, 0.25f,
-0.25f, -0.25f, 0.25f,
-0.25f, 0.25f, 0.25f,
0.25f, 0.25f, 0.25f,
-0.25f, -0.25f, 0.25f,
-0.25f, -0.25f, -0.25f,
-0.25f, 0.25f, 0.25f,
-0.25f, -0.25f, -0.25f,
-0.25f, 0.25f, -0.25f,
-0.25f, 0.25f, 0.25f,
-0.25f, -0.25f, 0.25f,
0.25f, -0.25f, 0.25f,
0.25f, -0.25f, -0.25f,
0.25f, -0.25f, -0.25f,
-0.25f, -0.25f, -0.25f,
-0.25f, -0.25f, 0.25f,
-0.25f, 0.25f, -0.25f,
0.25f, 0.25f, -0.25f,
0.25f, 0.25f, 0.25f,
0.25f, 0.25f, 0.25f,
-0.25f, 0.25f, 0.25f,
-0.25f, 0.25f, -0.25f};
gl4.glGenBuffers(1, buffer, 0);
gl4.glBindBuffer(GL.GL_ARRAY_BUFFER, buffer[0]);
gl4.glBufferData(GL.GL_ARRAY_BUFFER,
vertex_positions.length,
FloatBuffer.wrap(vertex_positions),
GL.GL_STATIC_DRAW);
gl4.glVertexAttribPointer(1, 3, GL.GL_FLOAT, false, 0, 0);
gl4.glEnableVertexAttribArray(1);
//gl4.glEnable(GL.GL_CULL_FACE);
gl4.glFrontFace(GL.GL_CW);
gl4.glEnable(GL.GL_DEPTH_TEST);
gl4.glDepthFunc(GL.GL_LEQUAL);
}
@Override
protected void shutdown(GL4 gl4) {
gl4.glDeleteProgram(program);
gl4.glDeleteVertexArrays(1, objects, objects[Semantic.Object.VAO]);
}
@Override
protected void onResize(GL4 gl4, int w, int h) {
aspect = w / h;
proj_matrix = FloatUtil.makePerspective(proj_matrix,
0,
true,
50.0f,
aspect,
0.1f,
1000.0f);
}
private int loadProgram(GL4 gl, String[] names, int[] types) {
ShaderProgram shaderProgram = new ShaderProgram();
for (int i = 0; i < names.length; i++) {
shaderProgram.add(loadShader(gl, types[i], names[i]));
}
shaderProgram.init(gl);
int id = shaderProgram.program();
shaderProgram.link(gl, System.out);
checkError(gl, "initProgram");
System.out.println("Program loaded! (" + id + ")");
return id;
}
private ShaderCode loadShader(GL4 gl, int type, String name) {
return ShaderCode.create(gl, type, this.getClass(), SHADERS_ROOT, null,
name, "sl", null, true);
}
public static void main(String[] args) {
new Listening9();
}
@Override
protected void onUP() {
st += 0.001f;
}
}
gl4.glBufferData(GL.GL_ARRAY_BUFFER,
vertex_positions.length*sizeof(GLfloat),
FloatBuffer.wrap(vertex_positions),
GL.GL_STATIC_DRAW);