2018-11-30 17:46:58 +08:00
|
|
|
|
#include<hgl/graph/RenderDevice.h>
|
2018-12-07 16:04:27 +08:00
|
|
|
|
#include<hgl/graph/RenderDriver.h>
|
2018-11-30 17:46:58 +08:00
|
|
|
|
#include<hgl/graph/RenderWindow.h>
|
2018-11-30 13:57:57 +08:00
|
|
|
|
#include<iostream>
|
2019-03-27 16:22:07 +08:00
|
|
|
|
#include<hgl/graph/Renderable.h>
|
2018-11-30 13:57:57 +08:00
|
|
|
|
|
|
|
|
|
using namespace hgl;
|
2018-11-30 19:38:36 +08:00
|
|
|
|
using namespace hgl::graph;
|
2018-11-30 13:57:57 +08:00
|
|
|
|
|
2018-11-30 16:50:08 +08:00
|
|
|
|
constexpr uint screen_width=1280;
|
|
|
|
|
constexpr uint screen_height=720;
|
|
|
|
|
|
|
|
|
|
constexpr char vertex_shader[]=R"(
|
|
|
|
|
#version 330 core
|
|
|
|
|
|
|
|
|
|
in vec2 Vertex;
|
|
|
|
|
in vec3 Color;
|
|
|
|
|
|
|
|
|
|
out vec4 FragmentColor;
|
|
|
|
|
|
|
|
|
|
void main()
|
|
|
|
|
{
|
|
|
|
|
FragmentColor=vec4(Color,1.0);
|
|
|
|
|
|
2018-12-07 16:04:27 +08:00
|
|
|
|
gl_Position=vec4(Vertex,0.0,1.0);
|
2018-11-30 16:50:08 +08:00
|
|
|
|
})";
|
|
|
|
|
|
|
|
|
|
constexpr char fragment_shader[]=R"(
|
|
|
|
|
#version 330 core
|
|
|
|
|
|
|
|
|
|
in vec4 FragmentColor;
|
|
|
|
|
out vec4 FragColor;
|
|
|
|
|
|
|
|
|
|
void main()
|
|
|
|
|
{
|
|
|
|
|
FragColor=vec4(FragmentColor.rgb,1);
|
|
|
|
|
})";
|
|
|
|
|
|
|
|
|
|
Shader shader;
|
|
|
|
|
|
|
|
|
|
bool InitShader()
|
|
|
|
|
{
|
|
|
|
|
if(!shader.AddVertexShader(vertex_shader))
|
|
|
|
|
return(false);
|
|
|
|
|
|
|
|
|
|
if(!shader.AddFragmentShader(fragment_shader))
|
|
|
|
|
return(false);
|
|
|
|
|
|
|
|
|
|
if(!shader.Build())
|
|
|
|
|
return(false);
|
|
|
|
|
|
|
|
|
|
if(!shader.Use())
|
|
|
|
|
return(false);
|
|
|
|
|
|
|
|
|
|
return(true);
|
|
|
|
|
}
|
|
|
|
|
|
2019-03-27 16:22:07 +08:00
|
|
|
|
ArrayBuffer *vb_vertex=nullptr;
|
|
|
|
|
ArrayBuffer *vb_color=nullptr;
|
2018-12-05 21:58:03 +08:00
|
|
|
|
VertexArray *va=nullptr;
|
2019-03-27 16:22:07 +08:00
|
|
|
|
Renderable *render_obj=nullptr;
|
2018-12-05 21:58:03 +08:00
|
|
|
|
|
2018-12-07 16:04:27 +08:00
|
|
|
|
constexpr float vertex_data[]={0.0f,0.5f, -0.5f,-0.5f, 0.5f,-0.5f };
|
2018-12-05 21:58:03 +08:00
|
|
|
|
constexpr float color_data[]={1,0,0, 0,1,0, 0,0,1 };
|
|
|
|
|
|
|
|
|
|
void InitVertexBuffer()
|
|
|
|
|
{
|
2019-03-27 16:22:07 +08:00
|
|
|
|
vb_vertex=CreateVBO(VB2f(3,vertex_data));
|
|
|
|
|
vb_color=CreateVBO(VB3f(3,color_data));
|
2018-12-05 21:58:03 +08:00
|
|
|
|
|
2019-03-27 16:26:45 +08:00
|
|
|
|
va=new VertexArray(); ///<创建VAO
|
2018-12-05 21:58:03 +08:00
|
|
|
|
|
2019-03-27 16:26:45 +08:00
|
|
|
|
const int vertex_location=shader.GetAttribLocation("Vertex"); ///<取得顶点数据输入流对应的shader地址
|
|
|
|
|
const int color_location=shader.GetAttribLocation("Color"); ///<取得颜色数据输入流对应的shader地址
|
2018-12-05 21:58:03 +08:00
|
|
|
|
|
2019-03-27 16:22:07 +08:00
|
|
|
|
va->SetPosition(vertex_location,vb_vertex);
|
|
|
|
|
va->AddBuffer(color_location,vb_color);
|
|
|
|
|
|
|
|
|
|
render_obj=new Renderable(GL_TRIANGLES,va);
|
2018-12-05 21:58:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
2018-11-30 16:10:41 +08:00
|
|
|
|
constexpr GLfloat clear_color[4]=
|
|
|
|
|
{
|
|
|
|
|
77.f/255.f,
|
|
|
|
|
78.f/255.f,
|
|
|
|
|
83.f/255.f,
|
|
|
|
|
1.f
|
|
|
|
|
};
|
2018-11-30 13:57:57 +08:00
|
|
|
|
|
2018-11-30 16:10:41 +08:00
|
|
|
|
constexpr GLfloat clear_depth=1.0f;
|
2018-11-30 13:57:57 +08:00
|
|
|
|
|
|
|
|
|
void draw()
|
|
|
|
|
{
|
2018-11-30 16:10:41 +08:00
|
|
|
|
glClearBufferfv(GL_COLOR,0,clear_color);
|
|
|
|
|
glClearBufferfv(GL_DEPTH,0,&clear_depth);
|
2018-12-07 16:04:27 +08:00
|
|
|
|
|
2019-03-27 16:22:07 +08:00
|
|
|
|
render_obj->Draw();
|
2018-11-30 13:57:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main(void)
|
|
|
|
|
{
|
|
|
|
|
RenderDevice *device=CreateRenderDeviceGLFW();
|
|
|
|
|
|
|
|
|
|
if(!device)
|
|
|
|
|
{
|
|
|
|
|
std::cerr<<"Create RenderDevice(GLFW) failed."<<std::endl;
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(!device->Init())
|
|
|
|
|
{
|
|
|
|
|
std::cerr<<"Init RenderDevice(GLFW) failed."<<std::endl;
|
|
|
|
|
return -2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WindowSetup ws;
|
|
|
|
|
|
2018-11-30 16:10:41 +08:00
|
|
|
|
ws.Name=U8_TEXT("Direct use \"OpenGL Core API\" Render");
|
2018-11-30 13:57:57 +08:00
|
|
|
|
|
|
|
|
|
RenderSetup rs;
|
|
|
|
|
|
2018-11-30 17:25:58 +08:00
|
|
|
|
RenderWindow *win=device->Create(screen_width,screen_height,&ws,&rs);
|
2018-11-30 16:50:08 +08:00
|
|
|
|
|
|
|
|
|
win->MakeToCurrent(); //切换当前窗口到前台
|
|
|
|
|
|
2018-12-07 16:04:27 +08:00
|
|
|
|
InitOpenGLDebug(); //初始化OpenGL调试输出
|
|
|
|
|
|
2018-11-30 16:50:08 +08:00
|
|
|
|
if(!InitShader())
|
|
|
|
|
{
|
|
|
|
|
std::cerr<<"init shader failed."<<std::endl;
|
|
|
|
|
return -3;
|
|
|
|
|
}
|
2018-11-30 13:57:57 +08:00
|
|
|
|
|
2018-12-05 21:58:03 +08:00
|
|
|
|
InitVertexBuffer();
|
|
|
|
|
|
2018-11-30 13:57:57 +08:00
|
|
|
|
win->Show();
|
|
|
|
|
|
|
|
|
|
while(win->IsOpen())
|
|
|
|
|
{
|
|
|
|
|
draw();
|
|
|
|
|
|
|
|
|
|
win->SwapBuffer(); //交换前后台显示缓冲区
|
|
|
|
|
win->PollEvent(); //处理窗口事件
|
|
|
|
|
}
|
|
|
|
|
|
2019-03-27 16:22:07 +08:00
|
|
|
|
delete render_obj;
|
|
|
|
|
delete va;
|
|
|
|
|
delete vb_color;
|
|
|
|
|
delete vb_vertex;
|
|
|
|
|
|
2018-11-30 13:57:57 +08:00
|
|
|
|
delete win;
|
|
|
|
|
delete device;
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|