Почему привязывание моего кадриста заставляет экран черным? [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему привязывание моего кадриста заставляет экран черным? [закрыто]

Сообщение Anonymous »

Я некоторое время пытался реализовать кадр -буфер в OpenGL, чтобы я мог представить всю сцену в квадроцикл, и я могу нанести фильтр HDR на шейдере, но когда я связываю этот фреймбафтер перед рендерингом, весь экран становится черным. Я не знаю, что еще я могу сделать после стольких попыток и переписываний, поэтому заранее спасибо < /p>
Я пытался следовать этому примеру из супербибля Opengl, поэтому из этого берется много кода. #version 450 core
layout (location=0) in vec3 vertex;
layout (location=1) in vec3 color;
layout (location=10) uniform mat4 modelview;
layout (location=11) uniform mat4 projection;
out vec3 color_out;

void main(void)
{
color_out=color;
gl_Position=projection*modelview*vec4(vertex,1);
}
< /code>
red.frag
#version 450 core
in vec3 color_out ;
out vec4 frag_color ;
void main(void)
{
frag_color=vec4(1,0,0 , 1) ;
}
< /code>
hdr.vert
#version 450 core
layout (location=0) in vec3 vertex;
layout (location=4) in vec2 texture_coordinates;
layout (location=10) uniform mat4 modelview;
layout (location=11) uniform mat4 projection;
out vec3 color_out;
out vec2 texture_coordinates_out;

void main(void)
{

texture_coordinates_out=texture_coordinates;
color_out=vec3(texture_coordinates,0);

gl_Position=projection*modelview*vec4(vertex,1);
}
< /code>
initialize_object on gl_widget class < /h2>
Загрузка шейдера < /p>
Position=_vertex3f(0,0,4);

_shaders Shader ;
Program1=Shader.load_shaders("./shaders/Red.vert","./shaders/Red.frag");
if ( Program1==0) {
exit( -1) ;
}

Program_HDR=Shader.load_shaders("./shaders/HDR.vert","./shaders/HDRSquare.frag");
if ( Program_HDR==0) {
exit( -1) ;
}

ushort vertex_indices[] =
{
//index data omitted
};

static const GLfloat vertex_data[] =
{
// Position Tex Coord
//Cube vertex and tex coords omitted
};

glGenBuffers(1, &position_buffer);
glBindBuffer(GL_ARRAY_BUFFER, position_buffer);
glBufferData(GL_ARRAY_BUFFER,
sizeof(vertex_data),
vertex_data,
GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), NULL);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid *)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(1);

glGenBuffers(1, &index_buffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
sizeof(vertex_indices),
vertex_indices,
GL_STATIC_DRAW);

//Frame buffer initialization

glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);

glGenTextures(1, &color_texture);
glBindTexture(GL_TEXTURE_2D, color_texture);
glTexStorage2D(GL_TEXTURE_2D, 9, GL_RGBA8, 512, 512);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glGenTextures(1, &depth_texture);
glBindTexture(GL_TEXTURE_2D, depth_texture);
glTexStorage2D(GL_TEXTURE_2D, 9, GL_DEPTH_COMPONENT32F, 512, 512);

glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, color_texture, 0);
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depth_texture, 0);

static const GLenum draw_buffers[] = { GL_COLOR_ATTACHMENT0 };
glDrawBuffers(1, draw_buffers);
< /code>
drail_object on gl_widgetclass < /h2>
QMatrix4x4 Modelview;
QMatrix4x4 Projection;
Camera.setToIdentity();
float Aspect =(float)(size().width())/(float)(size().height()); ;
Projection.frustum(-.1 , .1 , -.1*Aspect , .1*Aspect , (.1-(-.1))/2,1000) ;

Modelview.translate(-Position.x, -Position.y, -Position.z) ;

//Rendering the first cube. This line below makes everything go black

glBindFramebuffer(GL_FRAMEBUFFER, fbo);
static const GLfloat blue[] = { 0.0f, 0.0f, 0.3f, 1.0f };
static const GLfloat green[] = { 0.0f, 0.3f, 0.0f, 1.0f };
static const GLfloat one = 1.0f;

glViewport(0, 0, 512, 512);
glClearBufferfv(GL_COLOR, 0, green);
glClearBufferfi(GL_DEPTH_STENCIL, 0, 1.0f, 0);
glBindVertexArray(VAO1) ;
glUseProgram(Program1);
glUniformMatrix4fv(10 ,1,GL_FALSE , Modelview.data() ) ;
glUniformMatrix4fv(11 ,1,GL_FALSE , Projection.data() ) ;
glDrawArrays(GL_TRIANGLES, 0, 36);

//Rendering the second cube with the first one inside. We switch to the default framebuffer

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, size().width(), size().height());
glClearBufferfv(GL_COLOR, 0, blue);
glClearBufferfv(GL_DEPTH, 0, &one);
//The texture, which should have the previous scene drawn on it

glBindTexture(GL_TEXTURE_2D, color_texture);
glUseProgram(Program_HDR);
glUniformMatrix4fv(10 ,1,GL_FALSE , Modelview.data() ) ;
glUniformMatrix4fv(11 ,1,GL_FALSE , Projection.data() ) ;

glDrawArrays(GL_TRIANGLES, 0, 36);

glUseProgram(0 ) ;
glBindVertexArray(0 ) ;
< /code>
Желаемые результаты и снимки экрана < /h2>
Это скриншот basicfbo < /strong> программа, которую я использую в качестве базового


Подробнее здесь: https://stackoverflow.com/questions/795 ... n-go-black
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»