【发布时间】:2018-06-23 17:41:00
【问题描述】:
这是我的代码:
import org.lwjgl.*;
import org.lwjgl.glfw.*;
import org.lwjgl.opengl.*;
import org.lwjgl.system.*;
import java.io.File;
import java.nio.*;
import java.util.Scanner;
import static org.lwjgl.glfw.Callbacks.*;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL12.*;
import static org.lwjgl.opengl.GL13.*;
import static org.lwjgl.opengl.GL14.*;
import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.*;
import static org.lwjgl.opengl.GL21.*;
import static org.lwjgl.opengl.GL30.*;
import static org.lwjgl.opengl.GL31.*;
import static org.lwjgl.opengl.GL32.*;
import static org.lwjgl.opengl.GL33.*;
import static org.lwjgl.opengl.GL40.*;
import static org.lwjgl.opengl.GL41.*;
import static org.lwjgl.opengl.GL42.*;
import static org.lwjgl.opengl.GL43.*;
import static org.lwjgl.opengl.GL44.*;
import static org.lwjgl.opengl.GL45.*;
import static org.lwjgl.opengl.GL46.*;
import static org.lwjgl.system.MemoryStack.*;
import static org.lwjgl.system.MemoryUtil.*;
public class Test {
public static void main(String[] args) {
if (!glfwInit()) {
System.out.println("GLFW not init.");
return;
}
glfwDefaultWindowHints();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
long window = glfwCreateWindow(500, 500, "Window", NULL, NULL);
if (window == NULL) {
System.out.println("Window not create.");
return;
}
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
glfwShowWindow(window);
GL.createCapabilities();
Utilities.printGLInfo();
int vert=glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vert, Utilities.loadStrFromFile("Shaders/shader.vert"));
glCompileShader(vert);
if(glGetShaderi(vert, GL_COMPILE_STATUS)==GL_FALSE) {
System.out.println("Vertex shader compilation error:\n"+glGetShaderInfoLog(vert));
}
int frag=glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(frag, Utilities.loadStrFromFile("Shaders/shader.frag"));
glCompileShader(frag);
if(glGetShaderi(frag, GL_COMPILE_STATUS)==GL_FALSE) {
System.out.println("Fragment shader compilation error:\n"+glGetShaderInfoLog(frag));
}
int prog=glCreateProgram();
glAttachShader(prog, vert);
glAttachShader(prog, frag);
glLinkProgram(prog);
float[]vboData=new float[] {
0,0,0,
1,0,0,
0,1,0
};
int vao=glGenVertexArrays();
int vbo=glGenBuffers();
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER,vbo);
glBufferData(GL_ARRAY_BUFFER, FloatBuffer.wrap(vboData), GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, false, 3*Float.BYTES, 0);
glBindVertexArray(0);
System.out.println("prog="+prog+",vert="+vert+",frag="+frag);
System.out.println("vao="+vao+",vbo="+vbo);
while (!glfwWindowShouldClose(window)) {
glClearColor(1, 1, 1, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(prog);
glBindVertexArray(vao);
// glDrawElements(GL_TRIANGLES, indices);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);
glUseProgram(0);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
}
}
这是它打印的内容:
Version : 4.1 ATI-1.66.31
Vendor : ATI Technologies Inc.
Renderer : AMD Radeon Pro 560 OpenGL Engine
GLSL version : 4.10
Major version : 4
Minor version : 1
prog=3,vert=1,frag=2
vao=1,vbo=1
所以它正确地生成了着色器和 vao/vbos。
顶点着色器:
#version 410 core
layout (location = 0) in vec3 inPos;
out vec4 outPos;
void main(){
outPos=vec4(inPos,1.0);
}
片段着色器:
#version 410 core
out vec4 fragColor;
void main(){
fragColor=vec4(0.0,0.0,0.0,1.0);
}
我使用的是 macOS High Sierra 版本 10.13.4。
图形:
Radeon Pro 560 4096 MB
Intel HD Graphics 630 1536 MB
它显示一个具有正确宽度、高度和标题的白色窗口。 我认为问题出在我的 glVertexAttribPointer 调用上,而且我听说过可能需要用到的称为“缓冲区翻转”的东西。
编辑:
响应一些cmets,用这个顶点着色器:
#version 410 core
layout (location = 0) in vec3 inPos;
void main(){
gl_Position=vec4(inPos,1.0);
}
没有任何变化。
【问题讨论】:
-
顶点着色器的输出不应该是
gl_Position = vec4(inPos,1.0);吗?
标签: java opengl glsl lwjgl glfw