我刚刚开始学习现代OpenGL,我在渲染三角形时遇到了麻烦。当我启动程序时,当我尝试调用glDrawArray
时,它会给出一个无效操作异常。从控制台日志的外观来看,着色器的设置没有错误,程序也经过了验证。很多代码都是从本教程中复制的。我已经搜索了几个小时,无法找出导致问题的原因。如果我错过了一些基本的东西,我真的很抱歉。
java程序:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.FloatBuffer;
import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.ContextAttribs;
import org.lwjgl.opengl.Display;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.*;
import static org.lwjgl.opengl.GL30.*;
import org.lwjgl.opengl.PixelFormat;
public class MAIN {
public static void main(String[] args) {
try {
try {
ContextAttribs attr = new ContextAttribs(3, 2)
.withForwardCompatible(true).withProfileCore(true);
Display.create(new PixelFormat(), attr);
} catch (Exception ex) {
ex.printStackTrace();
return;
}
int vert = loadShader(ClassLoader.getSystemResource("shader.vert"),
GL_VERTEX_SHADER);
int frag = loadShader(ClassLoader.getSystemResource("shader.frag"),
GL_FRAGMENT_SHADER);
if (frag == -1 || vert == -1) {
Display.destroy();
System.exit(2);
}
int prog = glCreateProgram();
glAttachShader(prog, vert);
glAttachShader(prog, frag);
glLinkProgram(prog);
if (glGetProgrami(prog, GL_LINK_STATUS) == GL_FALSE) {
int length = glGetProgrami(prog, GL_INFO_LOG_LENGTH);
System.out.println(glGetProgramInfoLog(prog, length));
System.out.println("Linking failed");
Display.destroy();
System.exit(2);
}
System.out.println("Shader setup sucesfull");
glViewport(0, 0, Display.getWidth(), Display.getHeight());
glUseProgram(prog);
int buff = glGenVertexArrays();
glBindVertexArray(buff);
glValidateProgram(prog);
System.out.println(glGetProgrami(prog, GL_VALIDATE_STATUS) == GL_TRUE);
FloatBuffer buf = BufferUtils.createFloatBuffer(12);
buf.put(new float[] { -50, 50, 0, 1, 50, -50, 0, 1, 0, -50, 0, 1 });
buf.flip();
buff = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, buff);
glBufferData(GL_ARRAY_BUFFER, buf, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
while (!Display.isCloseRequested()
&& !Thread.currentThread().isInterrupted()) {
glClear(GL_COLOR_BUFFER_BIT);
glBindBuffer(GL_ARRAY_BUFFER, buff);
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 4, GL_FLOAT, false, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 3); // The Error
glBindBuffer(GL_ARRAY_BUFFER, 0);
Display.update();
Display.sync(60);
}
Display.destroy();
} catch (Exception ex) {
ex.printStackTrace();
if (Display.isCreated()) {
Display.destroy();
}
}
}
public static int loadShader(URL path, int shaderType) {
try (BufferedReader in = new BufferedReader(new InputStreamReader(
path.openStream()))) {
String text = "";
String line;
while ((line = in.readLine()) != null) {
text = text + "\n" + line;
}
text.replaceFirst("\n", "");
int shader = glCreateShader(shaderType);
System.out.println("Setup shader: " + path + " for id: " + shader);
glShaderSource(shader, text);
glCompileShader(shader);
if (glGetShaderi(shader, GL_COMPILE_STATUS) == GL_FALSE) {
int length = glGetShaderi(shader, GL_INFO_LOG_LENGTH);
String log = glGetShaderInfoLog(shader, length);
System.out.println("Shader " + shader + " log: " + log);
return -1;
}
return shader;
} catch (IOException e) {
e.printStackTrace();
}
return -1;
}
}
顶点着色器:
#version 330
layout(location = 0) in vec4 position;
void main() {
gl_Position = position;
}
和片段着色器:
#version 330
out vec4 outputColor;
void main() {
outputColor = vec4(1, 1, 1, 1);
}
您启用了错误的顶点属性:
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 4, GL_FLOAT, false, 0, 0);
glEnableVertexAttribArray()
的第一个参数是要启用的顶点属性的位置。它对应于glVertexAttribPointer()
的第一个参数,以及您在着色器代码中为该属性指定的位置:
layout(location = 0) in vec4 position;
由于您使用0作为位置的位置,因此glEnableVertexAttribArray()
的参数也应该为0:
glEnableVertexAttribArray(0);
以下是我的OS和Java版本: OS:Windows 10 openjdk版本“1.8.0_242” openjdk运行时环境(构建1.8.0_242-B08) openjdk 64位服务器VM(构建25.242-B08,混合模式)
我有以下代码: 出于某种原因,代码有时工作正常,有时则不正常,调试后我注意到当它不工作时,Datareader在其“HasRow”方法上有一个异常,特别是无效数字异常。我尝试直接在DBMS上运行结果查询,它执行得很好,有人知道为什么会发生这种异常吗?我错过了什么?。
我使用的是4.5.2.NET框架。有什么想法吗?
问题内容: 我正在为我的应用程序使用Hibernate 3.2.5。 我有一张桌子和一张桌子。 部门java 员工.java HBM映射文件 以下是本机SQL的代码: 我得到了例外: 当我直接在数据库中运行查询时,我会得到正确的输出,但是在hibernate状态下,它给出的是。我已经确认列名仅是正确的。 请让我知道如何解决此问题。 问题答案: 您的映射中包含以下内容: 但是您的sql 和之间没有这
我用java编写了一个简单的程序,它创建到Oracle数据库的连接并执行更新查询。 查询成功执行,但如果更新查询包含以“F”开头的列,则抛出异常 “java.sql.SQLSyntaxErrorException:ORA-00904:“F”:无效标识符”。 如果我删除以“F”开头的列,那么< code > prepare statement . getparametermetadata()将正确执
我正在尝试为我的登录构建一个提交表单,但我不知道为什么这个操作不起作用。有什么想法吗? > 列表项jquery $(“Form”).Submit(函数(e){e.PreventDefault();switch(this.id){case“login-form”:var$lg_username=$('#login_username').val();var$lg_password=$('#login_