Я пытаюсь реализовать эффекты постобработки в OpenGL, рисуя четырехугольную (2 tri) текстуру, которая повторяет экран, но использует неправильный шейдер
Я думаю, что glUseProgram() заставляет окно использовать входную программу шейдера, но это не работает. Я почти уверен, что ошибка где-то в цикле рендеринга.
код цикла рендеринга:
while(!glfwWindowShouldClose(window))
{
glUseProgram(defaultShader.program); // uses the normal shader
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer);
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(VAO.buffer); // VAO is for a test triangle
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT,0); // drawing test triangle
glBindVertexArray(0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glClearColor(0.4, 0.8, 1, 1);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(frameShader.program); // framebuffer shader
glBindVertexArray(quadVAO); // the quad's VAO uses x y and texturec ooordinates
glUniform1i(glGetUniformLocation(frameShader.program, "screenTexture"), textureColorbuffer); // not explicitly said in tutorialbut probably needed for the uniform^^^^
glBindTexture(GL_TEXTURE_2D, textureColorbuffer);
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);
glfwPollEvents();
}
инициализация всего кода:
unsigned int quadVAO, quadVBO;
glGenVertexArrays(1, &quadVAO);
glGenBuffers(1, &quadVBO);
glBindVertexArray(quadVAO);
glBindBuffer(GL_ARRAY_BUFFER, quadVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), &quadVertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float)));
unsigned int framebuffer;
glGenFramebuffers(1, &framebuffer);
unsigned textureColorbuffer;
glGenTextures(1, &textureColorbuffer);
glBindTexture(GL_TEXTURE_2D, textureColorbuffer);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 800, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
unsigned rbo;
glGenRenderbuffers(1, &rbo);
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 800);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureColorbuffer, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);
Код шейдера фреймбуфера:
const char* fvertexshadercode =
"#version 330 core"
"layout(location = 2) in vec2 aPos;"
"layout(location = 3) in vec2 aTexCoords;"
"out vec2 TexCoords;"
"void main()"
"{"
"TexCoords = aTexCoords;"
"gl_Position = vec4(pos.x, pos.y, 0.0, 1.0);"
"}";
const char* ffragmentshadercode =
"#version 330\r\n"
"in vec2 TexCoords;"
"out vec4 FragColor;"
"uniform sample2D screenTexture;"
"void main()"
"{"
" FragColor = texture(screenTexture,TexCoords);"
"}";
Подробнее здесь: https://stackoverflow.com/questions/786 ... ong-shader
Текстура цветового буфера OpenGL для постобработки с использованием неправильного шейдера? ⇐ C++
Программы на C++. Форум разработчиков
1719965934
Anonymous
Я пытаюсь реализовать [b]эффекты постобработки[/b] в OpenGL, рисуя четырехугольную (2 tri) текстуру, которая повторяет экран, но использует неправильный шейдер
Я думаю, что glUseProgram() заставляет окно использовать входную программу шейдера, но это не работает. Я почти уверен, что ошибка где-то в цикле рендеринга.
код цикла рендеринга:
while(!glfwWindowShouldClose(window))
{
glUseProgram(defaultShader.program); // uses the normal shader
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer);
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(VAO.buffer); // VAO is for a test triangle
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT,0); // drawing test triangle
glBindVertexArray(0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glClearColor(0.4, 0.8, 1, 1);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(frameShader.program); // framebuffer shader
glBindVertexArray(quadVAO); // the quad's VAO uses x y and texturec ooordinates
glUniform1i(glGetUniformLocation(frameShader.program, "screenTexture"), textureColorbuffer); // not explicitly said in tutorialbut probably needed for the uniform^^^^
glBindTexture(GL_TEXTURE_2D, textureColorbuffer);
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);
glfwPollEvents();
}
инициализация всего кода:
unsigned int quadVAO, quadVBO;
glGenVertexArrays(1, &quadVAO);
glGenBuffers(1, &quadVBO);
glBindVertexArray(quadVAO);
glBindBuffer(GL_ARRAY_BUFFER, quadVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), &quadVertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float)));
unsigned int framebuffer;
glGenFramebuffers(1, &framebuffer);
unsigned textureColorbuffer;
glGenTextures(1, &textureColorbuffer);
glBindTexture(GL_TEXTURE_2D, textureColorbuffer);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 800, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
unsigned rbo;
glGenRenderbuffers(1, &rbo);
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 800);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureColorbuffer, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);
Код шейдера фреймбуфера:
const char* fvertexshadercode =
"#version 330 core"
"layout(location = 2) in vec2 aPos;"
"layout(location = 3) in vec2 aTexCoords;"
"out vec2 TexCoords;"
"void main()"
"{"
"TexCoords = aTexCoords;"
"gl_Position = vec4(pos.x, pos.y, 0.0, 1.0);"
"}";
const char* ffragmentshadercode =
"#version 330\r\n"
"in vec2 TexCoords;"
"out vec4 FragColor;"
"uniform sample2D screenTexture;"
"void main()"
"{"
" FragColor = texture(screenTexture,TexCoords);"
"}";
Подробнее здесь: [url]https://stackoverflow.com/questions/78699517/opengl-color-buffer-texture-for-post-processing-using-wrong-shader[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия