2014-01-17 4 views
-1

У меня проблема при попытке визуализации треугольника с OpenGL с использованием LWJGL. Это ничего не делает, ничего не выносит и не вызывает никакой ошибки. glClear() работает (если я меняю цвет, цвет меняется).OpenGL ничего не показывает

Вы можете найти GLIntercept Вход здесь: GLIntercept Log

Это мой OpenGL Initialization-код:

glEnable(GL_CULL_FACE); 
glCullFace(GL_BACK); 
glFrontFace(GL_CW); 
glEnable(GL_DEPTH_TEST); 
glDepthMask(true); 
glDepthFunc(GL_LEQUAL); 
glDepthRange(0.0f, 1.0f); 

glViewport(0, 0, 800, 600); // my display size 

После этого я связываю свои шейдеры:

int vertexShader = glCreateShader(GL_VERTEX_SHADER); 
glShaderSource(vertexShader , vertexShaderCode); 
glCompileShader(vertexShader); 

int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 
glShaderSource(fragmentShader , fragmentShader Code); 
glCompileShader(fragmentShader); 

int program = glCreateProgram(); 
glAttachShader(program, vertexShader); 
glAttachShader(program, fragmentShader); 
glBindAttribLocation(program, 0, "vert"); 
glLinkProgram(program); 
glDetachShader(program, vertexShader); 
glDetachShader(program, fragmentShader); 

Это являются шейдеры:

colored.vert

#version 150 

uniform mat4 camera; 
uniform mat4 model; 

uniform vec4 color; 

in vec3 vert; 

out vec4 fragColor; 

void main() { 
    gl_Position = camera * model * vec4(vert, 1); 
    fragColor = color; 
} 

colored.frag

#version 150 

in vec4 fragColor; 

out vec4 finalColor; 

void main() { 
    finalColor = fragColor; 
} 

Затем я создаю VBÖ, IBO и Вао:

// VBO 
FloatBuffer vboBuffer = BufferUtils.createFloatBuffer(9); 
vboBuffer.put(
    0, 1, 0, 
    1, 0, 0, 
    -1, 0, 0); 
vboBuffer.flip(); 
vbo = glGenBuffers(); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(GL_ARRAY_BUFFER, vboBuffer, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

// IBO 
ShortBuffer iboBuffer = BufferUtils.createShortBuffer(3); 
iboBuffer.put(0, 1, 2); 
iboBuffer.flip(); 
ibo = glGenBuffers(); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, iboBuffer, GL_STATIC_DRAW); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

// VAO 
vao = glGenVertexArrays(); 
glBindVertexArray(vao); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 

glEnableVertexAttribArray(glGetAttribLocation(program, "vert")); 
glVertexAttribPointer(glGetAttribLocation(program, "vert"), 3, GL_FLOAT, false, 3 * Float.SIZE, 0); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 
glBindVertexArray(0); 

я изменил, что в соответствии с рекомендациями Andon М. Коулман, чтобы соответствовать основной профиль:
Это не решит мою проблему!

// IBO 
ShortBuffer iboBuffer = BufferUtils.createShortBuffer(3); 
iboBuffer.put(0, 1, 2); 
iboBuffer.flip(); 

// VBO 
FloatBuffer vboBuffer = BufferUtils.createFloatBuffer(9); 
vboBuffer.put(
    0, 1, 0, 
    1, 0, 0, 
    -1, 0, 0); 
vboBuffer.flip(); 

// VAO 
vao = glGenVertexArrays(); 
glBindVertexArray(vao); 

ibo = glGenBuffers(); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, iboBuffer, GL_STATIC_DRAW); 

vbo = glGenBuffers(); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(GL_ARRAY_BUFFER, vboBuffer, GL_STATIC_DRAW); 

glEnableVertexAttribArray(glGetAttribLocation(program, "vert")); 
glVertexAttribPointer(glGetAttribLocation(program, "vert"), 3, GL_FLOAT, false, 3 * Float.SIZE, 0); 

glBindVertexArray(0); 

Перед рендерингом:

glUseProgram(program); 
glUniform4f(glGetUniformLocation(program, "color"), colorR, colorG, colorB, colorA); 
glUseProgram(0); 

Rendering:

glClearColor(0, 0, 0, 1); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glUseProgram(program); 
FloatBuffer cameraBuffer = BufferUtils.createFloatBuffer(16); 
// a simple orthographic camera at the position (0|0|1) 
// left: -1; right: 1; bottom: -1; top: 1; zNear: -1; zFar: 1 
cameraBuffer.put(
    1.0, 0.0, 0.0, 0.0, 
    0.0, 1.0, 0.0, 0.0, 
    0.0, 0.0, -1.0, 0.0, 
    0.0, 0.0, 1.0, 1.0); 
cameraBuffer.flip(); 
glUniformMatrix4(glGetUniformLocation(program, "camera"), false, cameraBuffer); 
FloatBuffer modelBuffer = BufferUtils.createFloatBuffer(16); 
// no translation applied, so its an identity matrix 
modelBuffer .put(
    1.0, 0.0, 0.0, 0.0, 
    0.0, 1.0, 0.0, 0.0, 
    0.0, 0.0, 1.0, 0.0, 
    0.0, 0.0, 0.0, 1.0); 
modelBuffer.flip(); 
glUniformMatrix4(glGetUniformLocation(program, "model"), false, modelBuffer); 

glBindVertexArray(vao); 
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, 0); 
glBindVertexArray(0); 

glUseProgram(0); 

// check for OpenGL errors 
int error_code = glGetError(); 
if(error_code != GL_NO_ERROR) 
    System.err.print("OpenGL Error: " + gluErrorString(error_code)); 

Это все OpenGL команды я в правильном порядке.

GLIntercept Вход: GLIntercept Log

+2

Почему 'camera.m33' = ** - ** 1, и почему вы пытаетесь применить перевод в вашей проекции матрицы? Для этого создана матрица представлений. Вы должны начать с идентичных матриц и прокрутить свои вершины по часовой стрелке в пространстве NDC, если это сработает, вы можете начать изменять преобразование проекции/просмотра. Вы также изменили переднюю обмотку по умолчанию. Здесь есть ** много причин потенциальных проблем, начинайте с того, что вы не отбрасываете лицо и удаляете избыточный вызов 'glDepthRange (...)'. –

+0

Большое спасибо за ваш ответ! Что не так с матрицей проекции? Используя zNear = -1 & zFar = 1, значение -1 кажется разумным для меня (-1/(дальний)). CameraMatrix - фактически матрица проекции и матрица представлений, которые были объединены ранее. Но я буду следовать вашим советам по отладке, чтобы мой код, наконец, работал ... надеюсь ... – lschmierer

+1

Просто используйте ** - 1 **, чтобы изменить направление намотки. И у вас есть возможность отбрасывания лица. Теперь у вас есть вершины НДЦ, вращающиеся по часовой стрелке прямо сейчас, но перевертывание оси Z в матрице проекции делает их против часовой стрелки, которые будут отбираться с использованием вашей текущей настройки состояния. –

ответ

1

Ошибка будет решена. Проблема заключалась в том, что glVertexAttribPointer() ожидает, что шаг будет в байтах, а Float.SIZE в Java возвращает размер в битах.

Неправильно:

glVertexAttribPointer(..., ..., ..., ..., 3 * Float.SIZE, ...); 

Справа:

glVertexAttribPointer(..., ..., ..., ..., 3 * Float.SIZE/8, ...); 
Смежные вопросы