У меня проблемы с выводом чего-либо на экран.
private void initVBO() {
vao = GL30.glGenVertexArrays();
GL30.glBindVertexArray(vao);
float[] vertices = {
-0.5f, 0.5f, 0f,
0.5f, 0.5f, 0f,
0.5f, -0.5f, 0f,
-0.5f, -0.5f, 0f
};
FloatBuffer vertBuffer = BufferUtils.createFloatBuffer(vertices.length);
vertBuffer.put(vertices);
vertBuffer.flip();
this.vboID = GL15.glGenBuffers();
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, this.vboID);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertBuffer, GL15.GL_STATIC_DRAW);
positionAttribute = GL20.glGetAttribLocation(getMaterial().getShader()
.getProgram(), "position");
GL20.glEnableVertexAttribArray(positionAttribute);
GL20.glVertexAttribPointer(positionAttribute, 3, GL11.GL_FLOAT, false, 0,
0);
Color c = getMaterial().getColor();
float[] colors = {
c.red, c.green, c.blue, c.alpha,
c.red, c.green, c.blue, c.alpha,
c.red, c.green, c.blue, c.alpha,
};
FloatBuffer colorBuffer = BufferUtils.createFloatBuffer(colors.length);
colorBuffer.put(colors);
colorBuffer.flip();
this.vbocID = GL15.glGenBuffers();
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, this.vbocID);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, colorBuffer, GL15.GL_STATIC_DRAW);
colorAttribute = GL20.glGetAttribLocation(getMaterial().getShader().getProgram
(), "color");
GL20.glEnableVertexAttribArray(colorAttribute);
GL20.glVertexAttribPointer(colorAttribute, 4, GL11.GL_FLOAT, false, 0, 0);
byte[] indices = {
0, 1, 2,
2, 3, 0
};
ByteBuffer indicesBuffer = BufferUtils.createByteBuffer(indices.length);
indicesBuffer.put(indices);
indicesBuffer.flip();
this.vboiID = GL15.glGenBuffers();
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, this.vboiID);
GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesBuffer,
GL15.GL_STATIC_DRAW);
GL30.glBindVertexArray(0);
GL20.glDisableVertexAttribArray(positionAttribute);
GL20.glDisableVertexAttribArray(colorAttribute);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
}
public void render() {
GL20.glUseProgram(getMaterial().getShader().getProgram());
GL30.glBindVertexArray(this.vao);
GL20.glEnableVertexAttribArray(positionAttribute);
GL20.glEnableVertexAttribArray(colorAttribute);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, this.vboiID);
GL11.glDrawElements(GL11.GL_TRIANGLES, 6, GL11.GL_BYTE, 0);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
GL20.glDisableVertexAttribArray(colorAttribute);
GL20.glDisableVertexAttribArray(positionAttribute);
GL30.glBindVertexArray(0);
GL20.glUseProgram(0);
}
Шейдеры компилируются правильно, и я правильно привязываю атрибуты для положения и цвета. Я просто использую glOrtho, и он настроен правильно, потому что рисование в непосредственном режиме работает просто отлично. Я не уверен, может ли проблема быть связана с созданием индексов или с проблемой внутри glVertexAttribPointer. Я просто пытаюсь получить цветной прямоугольник, нарисованный на экране.
Обновление: вершинный шейдер:
#version 150
in vec3 position;
in vec4 color;
out vec4 passColor;
void main(void) {
gl_Position = vec4(position, 1.0);
passColor = color;
}
Фрагментный шейдер:
#version 150
in vec4 passColor;
out vec4 outColor;
void main(void) {
outColor = vec4(1.0, 1.0, 1.0, 1.0);
}
Я также обновил код инициализации и рендеринга выше. Также вот код загрузки шейдеров:
private void load(File vertex, File fragment) {
this.vertexID = FileUtility.loadShader(vertex, GL20.GL_VERTEX_SHADER);
this.fragmentID = FileUtility.loadShader(fragment, GL20.GL_FRAGMENT_SHADER);
programID = GL20.glCreateProgram();
GL20.glAttachShader(programID, vertexID);
GL20.glAttachShader(programID, fragmentID);
GL20.glBindAttribLocation(programID, 0, "position");
GL20.glBindAttribLocation(programID, 1, "color");
GL30.glBindFragDataLocation(programID, 0, "outColor");
GL20.glLinkProgram(programID);
GL20.glValidateProgram(programID);
int status = GL20.glGetProgrami(programID, GL20.GL_LINK_STATUS);
if (status != GL11.GL_TRUE) {
Log.print(LogLevel.Error, GL20.glGetProgramInfoLog(programID));
}
}
glOrtho
не будет этого делать, если вы не используете#version 110
иftransform
илиgl_ProjectionMatrix
и т. д. - person Robert Rouhani   schedule 27.02.2017GL11.glViewport(0, 0, Configuration.getInstance().getWindowWidth(), Configuration.getInstance().getWindowHeight()); GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glLoadIdentity();i GL11.glOrtho(-1, 1, 1, -1, 1, -1); GL11.glMatrixMode(GL11.GL_MODELVIEW);
Я не устанавливаю матрицу проекции в шейдерах; Я только устанавливаю цвет вершин. - person Greymouth   schedule 27.02.2017in
/out
в нерасширенных#version 120
шейдерах? - person genpfault   schedule 27.02.2017#version 150
, но это не дало никаких результатов. я обновил код - person Greymouth   schedule 27.02.2017