我读了建筑合成学的入门书和你好三角形章节,并决定加入LWJGL。当我第一次尝试后屏幕上没有任何东西时,我再次尝试从另一个GL 3.x教程移植一些C代码,但无济于事。
据我所知,我把所有部分放在一起,但屏幕仍然是黑色的。我理解这些概念,但我确信我在这里错过了一些简单的东西。
我已经尽可能简单地减少了这个。请注意,以下类使用此着色器帮助程序,并且从我所知道的情况来看,它按预期工作(除了缺少错误检查之外 - 但是,我已经确保着色器编译)。
public class HelloTriangle31 {
public static void main(String[] args) throws LWJGLException, InterruptedException, IOException
{
// Setup display mode (size)
Display.setDisplayMode(new DisplayMode(800, 600));
// Set context settings
// Basically forces 3.1
ContextAttribs contextAttributes = new ContextAttribs(3, 2)
.withForwardCompatible(true)
.withProfileCompatibility(false)
.withProfileCore(true);
Display.create(new PixelFormat(), contextAttributes);
Display.setResizable(false);
Display.setVSyncEnabled(true);
// Log some stuff
System.out.println("OpenGL version: " + GL11.glGetString(GL11.GL_VERSION));
// Setup
String vertexStr = readEntireFile(new File("vertex32.gl"));
int vertexID = ShaderUtils.makeShader(vertexStr, GL20.GL_VERTEX_SHADER);
String fragStr = readEntireFile(new File("fragment32.gl"));
int fragID = ShaderUtils.makeShader(fragStr, GL20.GL_FRAGMENT_SHADER);
int program = GL20.glCreateProgram();
GL20.glAttachShader(program, vertexID);
GL20.glAttachShader(program, fragID);
GL20.glBindAttribLocation(program, 0, "in_Position");
GL20.glBindAttribLocation(program, 1, "in_Color");
GL20.glLinkProgram(program);
FloatBuffer vertexFloats = BufferUtils.createFloatBuffer(9);
assert(vertexFloats.capacity() == 9);
vertexFloats.put(new float[]{
-0.3f, 0.5f, 0f,
-0.8f, -0.5f, 0f,
0.2f, -0.5f, 0f
});
FloatBuffer colorFloats = BufferUtils.createFloatBuffer(9);
assert(colorFloats.capacity() == 9);
colorFloats.put(new float[]{
1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f
});
IntBuffer vertexArrayInts = BufferUtils.createIntBuffer(1);
assert(vertexArrayInts.capacity() == 1);
GL30.glGenVertexArrays(vertexArrayInts);
GL30.glBindVertexArray(vertexArrayInts.get(0));
IntBuffer vertexBufferInts = BufferUtils.createIntBuffer(2);
assert(vertexBufferInts.capacity() == 2);
GL15.glGenBuffers(vertexBufferInts);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vertexBufferInts.get(0));
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertexFloats, GL15.GL_STATIC_DRAW);
GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 0, 0);
GL20.glEnableVertexAttribArray(0);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vertexBufferInts.get(1));
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, colorFloats, GL15.GL_STATIC_DRAW);
GL20.glVertexAttribPointer(1, 3, GL11.GL_FLOAT, false, 0, 0);
GL20.glEnableVertexAttribArray(1);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
GL30.glBindVertexArray(0);
GL11.glViewport(0, 0, 800, 600);
GL20.glUseProgram(program);
// Main loop
while(!Display.isCloseRequested())
{
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
GL30.glBindVertexArray(vertexArrayInts.get(0));
GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
GL30.glBindVertexArray(0);
Display.update();
}
Display.destroy();
}
private static String readEntireFile(File file) throws IOException
{
// Open input stream
FileInputStream fis = new FileInputStream(file);
try
{
byte[] buffer = new byte[(int) file.length()];
int len = fis.read(buffer);
return new String(buffer, 0, len);
}finally{
if(fis != null) fis.close();
}
}
}
vertex32.gl:
#version 140
in vec3 in_Position;
in vec3 in_Color;
out vec3 ex_Color;
void main(void)
{
gl_Position = vec4(in_Position, 1.0);
ex_Color = in_Color;
}
fragment32.gl:
#version 140
precision highp float; // needed only for version 1.30
in vec3 ex_Color;
out vec4 out_Color;
void main(void)
{
out_Color = vec4(ex_Color,1.0);
}
我看不出我错在哪里。没有错误,唯一的输出是版本字符串(它正确地显示了OpenGL 3.2——是的,我已经尝试过使用和不使用任何类型的显式上下文属性)。
在我遵循的所有教程中,让我感到奇怪的是,没有使用例如<code>glOrtho
我错过了什么?
编辑:具有 VM 参数 -Dorg.lwjgl.util.Debug=真
定义的产量:
[LWJGL] Initial mode: 1920 x 1080 x 32 @60Hz
[LWJGL] MemoryUtil Accessor: AccessorUnsafe
[LWJGL] GL_ARB_gpu_shader_fp64 was reported as available but an entry point is missing
[LWJGL] GL_ARB_shader_subroutine was reported as available but an entry point is missing
[LWJGL] GL_ARB_vertex_attrib_64bit was reported as available but an entry point is missing
OpenGL version: 3.2.0
我看不到你告诉OpenGL<code>in_Position语法实现了这一点。
如果您不能或不愿意使用该语法,则需要在链接着色器之前使用 glBindAttrib 位置
调用来执行此操作。
这是我第一次在这里张贴,所以请原谅任何错误。我是Java的绝对初学者,我的任务是编程‘生日问题’。其内容如下: 下面是我的代码:
我正在编写一个简单的示例来测试Flink中CEP的新Scala API,使用最新的Github版本1.1-SNAPSHOT。 Pattern只是一个值的检查,并为每个匹配的模式输出一个字符串作为结果。代码如下: 它在1.1-SNAPSHOT下编译和运行,没有问题,但jobmanager输出没有显示该print()的迹象。即使放松模式条件,只设置“开始”(接受所有事件),也不会返回任何结果。 此外,
有问题显示纹理在我的3D框在LWJGL使用光滑。早些时候我犯了一个错误: BasicShader类: BasicVertex.vs basicfragment.fs
我已将 LWJGL 安装到 Java 项目中,但无法导入 Display 类。 给出无法解决的错误。 DisplayMode和其他类也丢失。我在broswer里找不到他们。
我从另一个页面复制了以下JSP代码,但是当我从浏览器查看时,日期不显示。 我已将其保存为。
问题内容: 我有一个C / C ++程序,它在内存不足时可能会挂起。我们通过同时运行许多副本发现了这一点。我想在不完全破坏开发机性能的情况下调试程序。有没有一种方法来限制可用的内存,以便在请求了500K内存之后,new或malloc将返回NULL指针? 问题答案: 试着反省这个问题,并询问如何限制操作系统将允许您的进程使用的内存量。 尝试查看http://ss64.com/bash/ulimit.