В этом коде: < /p>
#include
#include
#include
#include
#include
#include
#include"Shader/Shader.h"
#include"Camera/Camera.h"
#include"Errors_Handler/Errors_Handler.h"
///Window
const unsigned int SCR_W=800,SCR_H=600;
///Callbacks
void process_window_resize(GLFWwindow*,int,int);
void process_input_once(GLFWwindow*,int,int,int,int);
void process_input_hold(GLFWwindow*);
void process_mouse_move(GLFWwindow*,double,double);
void process_mouse_scroll(GLFWwindow*,double,double);
///Camera
Camera camera(glm::vec3(0.0f,0.0f,3.0f));
bool firstMouse=true;
float lastX=400.0f,lastY=300.0f;
///Timing
float deltaTime=0.0f,last=0.0f,now=0.0f;
char FPS[128];
int main(){
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3);
glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_SAMPLES,4);
GLFWwindow*window=glfwCreateWindow(SCR_W,SCR_H,"off screen MSAA",NULL,NULL);
glfwSetWindowPos(window,50,50);
glfwSetFramebufferSizeCallback(window,process_window_resize);
glfwSetKeyCallback(window,process_input_once);
glfwSetCursorPosCallback(window,process_mouse_move);
glfwSetInputMode(window,GLFW_CURSOR,GLFW_CURSOR_DISABLED);
glfwSetScrollCallback(window,process_mouse_scroll);
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
gladLoadGLLoader((GLADloadproc)glfwGetProcAddress);
glClearColor(0.0f,0.0f,0.0f,1.0f);
///Global setup
glEnable(GL_MULTISAMPLE);
///Shader
Shader shader, s c r e e n S h a d e r ; < b r / > s h a d e r . l o a d _ a n d _ c o m p i l e _ s h a d e r ( & q u o t ; S h a d e r / S h a d e r . v s & q u o t ; , & q u o t ; S h a d e r / S h a d e r . f r s & q u o t ; ) ; < b r / > s c r e e n S h a d e r . l o a d _ a n d _ c o m p i l e _ s h a d e r ( & q u o t ; S h a d e r / s c r e e n S h a d e r . v s & q u o t ; , & q u o t ; S h a d e r / s c r e e n S h a d e r . f r s & q u o t ; ) ; < b r / > < b r / > / / / D a t a < b r / > f l o a t v e r t i c e s [ ] = { < b r / > / / r i g h t < b r / > 0 . 5 f , - 0 . 5 f , 0 . 5 f , < b r / > 0 . 5 f , - 0 . 5 f , - 0 . 5 f , < b r / > 0 . 5 f , 0 . 5 f , - 0 . 5 f , < b r / > 0 . 5 f , 0 . 5 f , 0 . 5 f , < b r / > / / l e f t < b r / > - 0 . 5 f , - 0 . 5 f , 0 . 5 f , < b r / > - 0 . 5 f , - 0 . 5 f , - 0 . 5 f , < b r / > - 0 . 5 f , 0 . 5 f , - 0 . 5 f , < b r / > - 0 . 5 f , 0 . 5 f , 0 . 5 f , < b r / > / / t o p < b r / > 0 . 5 f , 0 . 5 f , - 0 . 5 f , < b r / > 0 . 5 f , 0 . 5 f , 0 . 5 f , < b r / > - 0 . 5 f , 0 . 5 f , - 0 . 5 f , < b r / > - 0 . 5 f , 0 . 5 f , 0 . 5 f , < b r / > / / b o t t o m < b r / > 0 . 5 f , - 0 . 5 f , - 0 . 5 f , < b r / > 0 . 5 f , - 0 . 5 f , 0 . 5 f , < b r / > - 0 . 5 f , - 0 . 5 f , - 0 . 5 f , < b r / > - 0 . 5 f , - 0 . 5 f , 0 . 5 f , < b r / > / / f r o n t < b r / > 0 . 5 f , - 0 . 5 f , 0 . 5 f , < b r / > 0 . 5 f , 0 . 5 f , 0 . 5 f , < b r / > - 0 . 5 f , - 0 . 5 f , 0 . 5 f , < b r / > - 0 . 5 f , 0 . 5 f , 0 . 5 f , < b r / > / / b o t t o m < b r / > 0 . 5 f , - 0 . 5 f , 0 . 5 f , < b r / > 0 . 5 f , 0 . 5 f , 0 . 5 f , < b r / > - 0 . 5 f , - 0 . 5 f , 0 . 5 f , < b r / > - 0 . 5 f , 0 . 5 f , 0 . 5 f < b r / > } ; < b r / > u n s i g n e d i n t i n d i c e s [ ] = { < b r / > / / r i g h t < b r / > 0 , 1 , 2 , < b r / > 2 , 3 , 0 , < b r / > / / l e f t < b r / > 5 , 4 , 7 , < b r / > 7 , 6 , 5 , < b r / > / / t o p < b r / > 1 1 , 9 , 8 , < b r / > 8 , 1 0 , 1 1 , < b r / > / / b o t t o m < b r / > 1 5 , 1 3 , 1 2 , < b r / > 1 2 , 1 4 , 1 5 , < b r / > / / f r o n t < b r / > 1 8 , 1 6 , 1 7 , < b r / > 1 7 , 1 9 , 1 8 , < b r / > / / b a c k < b r / > 2 2 , 2 0 , 2 1 , < b r / > 2 1 , 2 3 , 2 2 < b r / > } ; < b r / > < b r / > / / / C u b e < b r / > u n s i g n e d i n t c u b e V A O , c u b e V B O , c u b e E B O ; < b r / > g l G e n V e r t e x A r r a y s ( 1 , & a m p ; c u b e V A O ) ; < b r / > g l G e n B u f f e r s ( 1 , & a m p ; c u b e V B O ) ;
glGenBuffers(1,&cubeEBO);
glBindVertexArray(cubeVAO);
glBindBuffer(GL_ARRAY_BUFFER,cubeVBO);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),&vertices,GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,cubeEBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),&indices,GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(float),(void*)0);
///Uniform buffer object
unsigned int uniformBlockIndexInCubeShader=glGetUniformBlockIndex(shader.ID,"Matrices");
glUniformBlockBinding(shader.ID,uniformBlockIndexInCubeShader,0);
unsigned int UBO;
glGenBuffers(1,&UBO);
glBindBuffer(GL_UNIFORM_BUFFER,UBO);
glBufferData(GL_UNIFORM_BUFFER,2*sizeof(glm::mat4),NULL,GL_STATIC_DRAW);
glBindBufferRange(GL_UNIFORM_BUFFER,0,UBO,0,2*sizeof(glm::mat4));
///Frame buffer
unsigned int FBO;
glGenFramebuffers(1,&FBO);
glBindFramebuffer(GL_FRAMEBUFFER,FBO);
//prepare texture color attachment
unsigned int textureColorAttachment;
glGenTextures(1,&textureColorAttachment);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE,textureColorAttachment);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE,4,GL_RGB,SCR_W,SCR_H,GL_TRUE);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE,0);
glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D_MULTISAMPLE,textureColorAttachment,0);
//prepare render buffer object
unsigned int RBO;
glGenRenderbuffers(1,&RBO);
glBindRenderbuffer(GL_RENDERBUFFER,RBO);
glRenderbufferStorageMultisample(GL_RENDERBUFFER,4,GL_DEPTH24_STENCIL8,SCR_W,SCR_H);
glBindRenderbuffer(GL_RENDERBUFFER,0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_STENCIL_ATTACHMENT,GL_RENDERBUFFER,RBO);
if(glCheckFramebufferStatus(GL_FRAMEBUFFER)==GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT){
Errors_Handler::Show_Error("Failed to create framebuffer","OpenGL");
}
///Post processing framebuffer
unsigned int postFBO;
glGenFramebuffers(1,&postFBO);
glBindFramebuffer(GL_FRAMEBUFFER,postFBO);
//prepare texture color attachment
unsigned int screenTexture;
glGenTextures(1,&screenTexture);
glBindTexture(GL_TEXTURE_2D,screenTexture);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,SCR_W,SCR_H,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);
glFramebufferTexture2D(GL_TEXTURE_2D,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,screenTexture,0);
if(glCheckFramebufferStatus(GL_FRAMEBUFFER)==GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT){
Errors_Handler::Show_Error("Failed to create post processing framebuffer","OpenGL");
}
///Screen data
float screenVertices[]={
-1.0f,-1.0f,
1.0f,-1.0f,
1.0f,1.0f,
-1.0f,1.0f
};
float screenTextureCoordinates[]={
0.0f,0.0f,
1.0f,0.0f,
1.0f,1.0f,
0.0f,1.0f
};
unsigned int screenIndices[]={
0,1,2,
2,3,0
};
unsigned int screenVAO,screenVBO,screenEBO;
glGenVertexArrays(1,&screenVAO);
glGenBuffers(1,&screenVBO);
glGenBuffers(1,&screenEBO);
glBindVertexArray(screenVAO);
glBindBuffer(GL_ARRAY_BUFFER,screenVBO);
glBufferData(GL_ARRAY_BUFFER,sizeof(screenVertices)+sizeof(screenTextureCoordinates),NULL,GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER,0,sizeof(screenVertices),&screenVertices);
glBufferSubData(GL_ARRAY_BUFFER,sizeof(screenVertices),sizeof(screenTextureCoordinates),&screenTextureCoordinates);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,screenEBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(screenIndices),&screenIndices,GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,2*sizeof(float),(void*)0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1,2,GL_FLOAT,GL_FALSE,2*sizeof(float),(void*)(sizeof(screenVertices)));
///Render loop
screenShader.activate();
screenShader.pass_int("texture",0);
glActiveTexture(GL_TEXTURE0);
while(!glfwWindowShouldClose(window)){
now=glfwGetTime();
deltaTime=now-last;
last=now;
snprintf(FPS,128,"Off screen MSAA - %.0f",1.0f/deltaTime);
glfwSetWindowTitle(window,FPS);
process_input_hold(window);
glClearColor(0.1f,0.1f,0.1f,1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
shader.activate();
glBindFramebuffer(GL_FRAMEBUFFER,FBO);
glEnable(GL_DEPTH_TEST);
glClearColor(0.0f,0.0f,0.0f,1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glm::mat4 projection=glm::perspective(glm::radians(camera.Zoom),800.0f/600.0f,0.1f,100.0f);
glm::mat4 view=camera.get_view_matrix();
glm::mat4 model=glm::mat4(1.0f);
glBufferSubData(GL_UNIFORM_BUFFER,0,sizeof(glm::mat4),glm::value_ptr(projection));
glBufferSubData(GL_UNIFORM_BUFFER,sizeof(glm::mat4),sizeof(glm::mat4),glm::value_ptr(view));
//render cube
shader.pass_mat_4("model",model);
glBindVertexArray(cubeVAO);
glDrawElements(GL_TRIANGLES,36,GL_UNSIGNED_INT,0);
//transfer data
glBindFramebuffer(GL_READ_FRAMEBUFFER,FBO);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,postFBO);
glBlitFramebuffer(0,0,SCR_W,SCR_H,0,0,SCR_W,SCR_H,GL_COLOR_BUFFER_BIT,GL_LINEAR);
//render screen quad
glBindFramebuffer(GL_FRAMEBUFFER,0);
glDisable(GL_DEPTH_TEST);
glClearColor(1.0f,1.0f,1.0f,1.0f);
glClear(GL_COLOR_BUFFER_BIT);
screenShader.activate();
glBindTexture(GL_TEXTURE_2D,screenTexture);
glBindVertexArray(screenVAO);
glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
void process_window_resize(GLFWwindow*,int w,int h){
glViewport(0,0,w,h);
}
void process_input_once(GLFWwindow*window,int key,int,int state,int){
if(key==GLFW_KEY_ESCAPE&&state==GLFW_PRESS){
glfwSetWindowShouldClose(window,1);
}
}
void process_input_hold(GLFWwindow*window){
if(glfwGetKey(window,GLFW_KEY_W)==GLFW_PRESS){
camera.move_camera(FORWARD,deltaTime);
}
if(glfwGetKey(window,GLFW_KEY_S)==GLFW_PRESS){
camera.move_camera(BACKWARD,deltaTime);
}
if(glfwGetKey(window,GLFW_KEY_D)==GLFW_PRESS){
camera.move_camera(RIGHT,deltaTime);
}
if(glfwGetKey(window,GLFW_KEY_A)==GLFW_PRESS){
camera.move_camera(LEFT,deltaTime);
}
if(glfwGetKey(window,GLFW_KEY_SPACE)==GLFW_PRESS){
camera.move_camera(UP,deltaTime);
}
if(glfwGetKey(window,GLFW_KEY_LEFT_SHIFT)==GLFW_PRESS){
camera.move_camera(DOWN,deltaTime);
}
}
void process_mouse_move(GLFWwindow*,double xpos,double ypos){
if(firstMouse){
lastX=xpos;
lastY=ypos;
firstMouse=false;
}
float xoffset=xpos-lastX;
float yoffset=lastY-ypos;
lastX=xpos;
lastY=ypos;
camera.rotate_camera(xoffset,yoffset);
}
void process_mouse_scroll(GLFWwindow*,double,double yoffset){
camera.zoom_camera(yoffset);
}
< /code>
Когда я строю и запускаю, я вижу только черный экран.
(требуемый вывод - только зеленый куб) < /p>
Обратите внимание, что я не выполняю каких -либо операций по послепрохождениям в шейдерах.>
Подробнее здесь: https://stackoverflow.com/questions/795 ... -rendering
OpenGL за кадром MSAA не рендеринг ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Несоответствие производительности Vulkan Linux/Windows с включенным MSAA [закрыто]
Anonymous » » в форуме Linux - 0 Ответы
- 10 Просмотры
-
Последнее сообщение Anonymous
-