2013-08-21 4 views
2

РЕШЕНИЕПроблема с матрицей проецирования на Shader GLSL OpenGL

Проблема была в моем г интервале Я рассматривал отрицательные значения на г как (-0.1f < < г 100f), вместо этого я использовал положительный интервал для ближней/дальней плоскости ex: (0.0f < z < 100.0f), я организовал другие вещи с устаревшей пустотой в OpenGL, и я устроил свое плохое положение на моем glm :: lookAt.

Примечание: не смешивайте старый способ рендеринга с новым способом визуализации (это хорошая практика, но может быть проблемой), кстати: вы должны понимать свою позицию в пространстве.

Спасибо всем, ребята :)


Я начинающий графический программист, и я пытался сделать очень простой треугольник с использованием основных вершин/фрагментов шейдеров. Но у меня одна ошибка с моей матрицей проекции, и я не могу ее найти. Кроме того, Im пытается сделать изменение формы, и я хочу, чтобы переконвертировать обратный вызов хорошо работает с треугольником, нарисованным шейдером. Когда я пишу эти продукты в моем рендеринге, это происходит:

MVP = ProjectionMatrix * ModelViewMatrix;

Результат ->I dont Like

И если я только назначить MVP в видовую матрицу Я получил это:

Результат ->I dont Like too because the origin should be in the upper left corner and is in the center of the window

Это мой Reshape Пустоты

void OpenGL_Initialization(int w, int h){ 
    ProjectionMatrix = glm :: ortho(0.0f,(GLfloat)w,(GLfloat)h,0.0f,0.1f, 100.0f); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glLoadMatrixf(glm :: value_ptr(ProjectionMatrix)); 
    glMatrixMode(GL_MODELVIEW); 
} 

void Reshape(int w, int h){ 
    width = w; 
    height = h; 
    glViewport(0,0,w,h); 
    OpenGL_Initialization(w,h); 
} 

И это мой обратный вызов визуализации:

void Render(){ 
    glClearColor(0.75,0.75,0.75,1.0); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glGetFloatv(GL_MODELVIEW_MATRIX,glm :: value_ptr(ModelViewMatrix)); 

    MVP = ProjectionMatrix * ModelViewMatrix; 

    glUniformMatrix4fv(glGetUniformLocation(ProgramHandler,"MVP"),1,GL_FALSE,glm :: value_ptr(MVP)); 

    glBindVertexArray(vaoHandle); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 
    glBindVertexArray(0); 

    glutSwapBuffers(); 

}

Также это моя вершина и пиксельный шейдер

#version 400 

layout (location = 0) in vec3 VertexPosition; 
layout (location = 1) in vec3 VertexColor; 

uniform mat4 MVP; 

out vec3 Color; 

void main(){  
    Color = VertexColor; 
    gl_Position = MVP*vec4(VertexPosition,1.0); 
} 

#version 400 
in vec3 Color; 
out vec4 FragColor; 
void main(){ 
    FragColor = vec4(Color,1.0); 
} 

РВО А.Н. d инициализации ВАО:

void InitVBO(GLuint programHandler){ 
    glBindAttribLocation(programHandler,0,"VertexPosition"); 
    glBindAttribLocation(programHandler,1,"VertexColor"); 

    GLfloat positionData[] = {-0.5f,0.5f,0.0f,0.0f,-.5f,0.0f,0,0,0}; 
    GLfloat colorData[] = {1.0f,0.0f,0.0f,0.0f,1.0f,0.0f,0.0f,0.0f,1.0f}; 

    GLuint vboHandles[2]; 

    glGenBuffers(2,vboHandles); 

    glBindBuffer(GL_ARRAY_BUFFER,vboHandles[0]); 
    glBufferData(GL_ARRAY_BUFFER,9*sizeof(GLfloat),positionData,GL_STATIC_DRAW); 

    glBindBuffer(GL_ARRAY_BUFFER,vboHandles[1]); 
    glBufferData(GL_ARRAY_BUFFER,9*sizeof(GLfloat),colorData,GL_STATIC_DRAW); 

    glGenVertexArrays(1, &vaoHandle); 
    glBindVertexArray(vaoHandle); 

    glEnableVertexAttribArray(0); 
    glEnableVertexAttribArray(1); 

    glBindBuffer(GL_ARRAY_BUFFER, vboHandles[0]); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0,(GLubyte *)NULL); 

    glBindBuffer(GL_ARRAY_BUFFER, vboHandles[1]); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0,(GLubyte *)NULL); 
} 

+4

Пожалуйста, не вызывайте свои функции, возвращающие пустоты «пустоты». – thokra

+0

Кроме того, при ближней плоскости в точке (z == 0,1f) вы ничего не увидите. Вы пробовали немного переместить камеру «назад», то есть некоторое расстояние вдоль положительной оси z? (Подсказка: glm :: lookAt) – thokra

+0

Привет, thokra, да, я пробовал и ничего не происходит – czapata91

ответ

2

Похоже, вы используете сочетание fixed-function pipeline (то есть. GL1.x) и программируемый шейдерный конвейер звонки. Хотя это, вероятно, не вызывает проблемы, о которых вы описали, обычно считается хорошей практикой использовать либо одну, либо другую, но не обе в то же время.

Правильный способ загрузки матрицы, используемой шейдерной программой, заключается в вызове glUniformMatrix4fv (как вы это сделали).Однако вызовы glMatrixMode, glLoadIdentity и glLoadMatrix в функции OpenGL_Initialization(int w, int h) фактически не будут влиять на состояние используемой шейдерной программы; вместо этого они изменяют состояние матричного стека now-deprecated.

Аналогично, вызов glGetFloatv(GL_MODELVIEW_MATRIX,glm :: value_ptr(ModelViewMatrix)) получает данные матрицы модели, используемые встроенным стеком матриц, которые могут содержать данные мусора.

В принципе, то, что я предлагаю вам сделать, это угробить все устаревшее функциональность и переопределение функции OpenGL_Initialization довольно просто, как это:

void OpenGL_Initialization(int w, int h){ 
    ProjectionMatrix = glm::ortho(0.0, (GLfloat)w, (GLfloat)h, 0.0, -1.0, 1.0); 
} 

и в рендеринге обратного вызова вы бы просто сделать

glClearColor(0.75, 0.75, 0.75, 1.0); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glm::mat4 ModelViewMatrix; // default constructor => identity 
MVP = ProjectionMatrix * ModelViewMatrix; 

glUseProgram(ProgramHandler); // possibly redundant 
GLuint MVP_loc = glGetUniformLocation(ProgramHandler, "MVP"); 
glUniformMatrix4fv(MVP_loc, 1, GL_FALSE, glm::value_ptr(MVP)); 

/* draw, swap buffers */ 
+0

Здравствуйте, elmov, спасибо за ваш ответ, я внес изменения, но проблема все еще происходит. Это очень странно. – czapata91

+0

Спасибо за советы elmov, я решил проблему несколько часов назад, проверьте, в чем проблема в верхней части этой темы. С уважением :) – czapata91

0

В вашем коде есть две проблемы:

  1. Ваш треугольник находится в плоскости z = 0, но вы устанавливаете ближнее/дальнее значение 0,1 и 100, поэтому ваш треугольник находится вне поля обзора, вам необходимо установить значение z в диапазоне (-0,1 < z < -100)
  2. Если w, h - размер вашего окна, то ваш треугольник после растеризации будет занимать только один пиксель на вашем экране, другими словами, вы вряд ли увидите что-либо на своем экране. Вы можете считать, что находитесь в пространстве с пиксельными единицами, поэтому вам нужен треугольник разумного размера. Таким образом, исправление для этой проблемы, либо вы меняете вершинную позицию больше, например. (w/2, h/2, -1, w, h/2, -1, w, h, -1), или вы можете изменить орт как glm :: ortho (-1, 1, -1, 1 , 0,1f, 100,0f);
+0

Привет, Уэйн Ван, я решил проблему несколько часов назад, я проверил матрицу проекций с glm :: перспективой и glm :: орто, Это была небольшая деталь с glm :: lookAt, плохая позиция и другие вещи в моем коде. Ссылка на значение z, я использовал положительный интервал для z (0.0, 100.0), отрицательные значения на моей ближней плоскости сбивали мой взгляд. Спасибо 4 ваш комментарий :). – czapata91

Смежные вопросы