From d7a972a0f16da0fd7bf4c0b70913920216ff3113 Mon Sep 17 00:00:00 2001 From: chai Date: Sat, 8 Jun 2019 08:34:52 +0800 Subject: *misc --- source/modules/asura-core/graphics/canvas.h | 9 --- source/modules/asura-core/graphics/gfx_device.h | 26 +------ source/modules/asura-core/graphics/image.cpp | 1 + source/modules/asura-core/graphics/image.h | 4 +- source/modules/asura-core/graphics/shader.cpp | 97 +++++++++++++++---------- source/modules/asura-core/graphics/shader.h | 9 ++- 6 files changed, 71 insertions(+), 75 deletions(-) (limited to 'source/modules/asura-core/graphics') diff --git a/source/modules/asura-core/graphics/canvas.h b/source/modules/asura-core/graphics/canvas.h index 49096c7..4175561 100644 --- a/source/modules/asura-core/graphics/canvas.h +++ b/source/modules/asura-core/graphics/canvas.h @@ -47,19 +47,10 @@ namespace AsuraEngine private: - /// - /// Frame buffer object id. - /// GLuint mFBO; - /// - /// 绑定的tex - /// GLuint mTex; - /// - /// canvas的大小 - /// uint mWidth, mHeight; public: diff --git a/source/modules/asura-core/graphics/gfx_device.h b/source/modules/asura-core/graphics/gfx_device.h index 5bb8c6a..c93717f 100644 --- a/source/modules/asura-core/graphics/gfx_device.h +++ b/source/modules/asura-core/graphics/gfx_device.h @@ -46,14 +46,8 @@ namespace AsuraEngine GfxDevice(); ~GfxDevice(); - /// - /// 获得常量值 - /// int GetParam(GLParams param); - /// - /// 初始化OpenGL上下文参数,发生在创建OpenGL上下文之后。此函数会注册OpenGL函数的地址。 - /// bool Init(const AEMath::Recti& viewport); bool Inited(); @@ -64,12 +58,8 @@ namespace AsuraEngine void UnuseShader(); Shader* GetShader(); - // Draw call. void DrawArrays(GLenum mode, GLint first, GLsizei count); - /// - /// Matrix stack相关操作 - /// void SetMatrixMode(MatrixMode mode); MatrixMode GetMatrixMode(); void PushMatrix(); @@ -87,20 +77,10 @@ namespace AsuraEngine void SetDrawColor(float r, float g, float b, float a); Color& GetDrawColor(); - /// - /// 清理错误提示 - /// void WipeError(); bool HasError(); GLenum GetError(); - /// - /// OpenGL3.0以后由用户管理矩阵变换、视口、shader等参数,这里保存一些OpenGL状态。注意 - /// 似乎全进程的,也就是说,Asura不支持多线程渲染。OpenGL上下文的创建使得一个上下 - /// 文绑定在一个HDC\窗口上,由于窗口是在特定线程创建的,所以OpenGL上下文也绑定了一个 - /// 特定的线程。同一个线程的不同HDC\窗口可以共享同一个OpenGL上下文。共享上下文是为了 - /// 共享上下文中创建的textuer\shader等handle。 - /// struct { Shader* shader; ///< 当前使用的shader @@ -113,9 +93,9 @@ namespace AsuraEngine #if ASURA_GL_PROFILE struct { - uint drawCall; ///< 统计drawcall - uint canvasSwitch; ///< 切换texture的次数 - uint shaderSwitch; ///< 切换shader的次数 + uint drawCall; ///< 统计drawcall + uint canvasSwitch; ///< 切换texture的次数 + uint shaderSwitch; ///< 切换shader的次数 } stats; #endif diff --git a/source/modules/asura-core/graphics/image.cpp b/source/modules/asura-core/graphics/image.cpp index d2f1d7b..42fc2ab 100644 --- a/source/modules/asura-core/graphics/image.cpp +++ b/source/modules/asura-core/graphics/image.cpp @@ -7,6 +7,7 @@ #include "gfx_device.h" using namespace AEIO; +using namespace AEImage; namespace AsuraEngine { diff --git a/source/modules/asura-core/graphics/image.h b/source/modules/asura-core/graphics/image.h index 932ca65..8e3e7d3 100644 --- a/source/modules/asura-core/graphics/image.h +++ b/source/modules/asura-core/graphics/image.h @@ -44,8 +44,8 @@ namespace AsuraEngine /// 将解析后的图像数据提交到GPU,更新像素信息。用来重新构建image,使用glTexImage2D重 /// 新提交image的像素数据。 /// - bool Load(ImageData* decodeData); - bool Load(ImageData* decodeData, const AEMath::Vector2i& pos); + bool Load(AEImage::ImageData* decodeData); + bool Load(AEImage::ImageData* decodeData, const AEMath::Vector2i& pos); uint GetWidth(); uint GetHeight(); diff --git a/source/modules/asura-core/graphics/shader.cpp b/source/modules/asura-core/graphics/shader.cpp index 866c4da..afd10b0 100644 --- a/source/modules/asura-core/graphics/shader.cpp +++ b/source/modules/asura-core/graphics/shader.cpp @@ -21,74 +21,97 @@ namespace AsuraEngine Shader::~Shader() { - if(mVertShader != 0) - glDeleteShader(mVertShader); - if(mFragShader != 0) - glDeleteShader(mFragShader); - if(mProgram != 0) - glDeleteProgram(mProgram); + if(mVertShader) glDeleteShader(mVertShader); + if(mFragShader) glDeleteShader(mFragShader); + if(mProgram) glDeleteProgram(mProgram); } bool Shader::Load(const string& vert, const string& frag) { - GLenum err = GL_NO_ERROR; - GLint success; string warnning = ""; - if (mProgram == 0) + if (!mProgram) { mProgram = glCreateProgram(); - if (mProgram == 0) + if (!mProgram) throw Exception("Cannot create OpenGL shader program."); } - if (mVertShader == 0) + if (!CompileVertexShader(vert, warnning)) { - mVertShader = glCreateShader(GL_VERTEX_SHADER); - if (mVertShader == 0) - throw Exception("Cannot create OpenGL vertex shader."); + throw Exception("Compile vertex shader failed:%s", warnning); } - if (mFragShader == 0) + if (!CompileFragementShader(frag, warnning)) { - mFragShader = glCreateShader(GL_FRAGMENT_SHADER); - if(mFragShader == 0) - throw Exception("Cannot create OpenGL fragment shader."); + throw Exception("Compile fragment shader failed:%s", warnning); } - const GLchar* source; + glAttachShader(mProgram, mVertShader); + glAttachShader(mProgram, mFragShader); + + glLinkProgram(mProgram); + GLint success; + glGetProgramiv(mProgram, GL_LINK_STATUS, &success); + if (success == GL_FALSE) + { + warnning = GetProgramWarnings(); + throw Exception("Link shader program failed:\n%s", warnning.c_str()); + } + + return true; + } + + bool Shader::CompileVertexShader(const string& vert, string& outError) + { + if (!mVertShader) + { + mVertShader = glCreateShader(GL_VERTEX_SHADER); + if (!mVertShader) + { + outError = "Cannot create OpenGL Vertex shader."; + return false; + } + } + + const GLchar* source = vert.c_str(); + GLint success; - // Compile vertex shader. - source = vert.c_str(); glShaderSource(mVertShader, 1, &source, NULL); glCompileShader(mVertShader); glGetShaderiv(mVertShader, GL_COMPILE_STATUS, &success); if (success == GL_FALSE) { - warnning = GetShaderWarnings(mVertShader); - throw Exception("Compile vertex shader failed:\n%s", warnning.c_str()); + outError = GetShaderWarnings(mVertShader); + return false; } - // Compile fragment shader. + return true; + } + + bool Shader::CompileFragementShader(const string& frag, string& outError) + { + if (!mFragShader) + { + mFragShader = glCreateShader(GL_FRAGMENT_SHADER); + if (!mFragShader) + { + outError = "Cannot create OpenGL fragment shader."; + return false; + } + } + + const GLchar* source = frag.c_str(); + GLint success; + source = frag.c_str(); glShaderSource(mFragShader, 1, &source, NULL); glCompileShader(mFragShader); glGetShaderiv(mFragShader, GL_COMPILE_STATUS, &success); if (success == GL_FALSE) { - warnning = GetShaderWarnings(mFragShader); - throw Exception("Compile fragment shader failed:\n%s", warnning.c_str()); - } - - // Link program. - glAttachShader(mProgram, mVertShader); - glAttachShader(mProgram, mFragShader); - glLinkProgram(mProgram); - glGetProgramiv(mProgram, GL_LINK_STATUS, &success); - if (success == GL_FALSE) - { - warnning = GetProgramWarnings(); - throw Exception("Link shader program failed:\n%s", warnning.c_str()); + outError = GetShaderWarnings(mFragShader); + return false; } return true; diff --git a/source/modules/asura-core/graphics/shader.h b/source/modules/asura-core/graphics/shader.h index b5d866e..f4553ec 100644 --- a/source/modules/asura-core/graphics/shader.h +++ b/source/modules/asura-core/graphics/shader.h @@ -45,12 +45,10 @@ namespace AsuraEngine void OnUse(); void OnUnuse(); - /// 顶点数据 void SetAttribute(int loc, VertexBuffer* vbo, uint offseti = 0, uint stridei = 0, bool normalized = false); int GetAttributeLocation(const std::string& attribute); void DisableAttribute(int loc); - /// Uniform变量 bool HasUniform(const std::string& uniform); uint GetUniformLocation(const std::string& uniform); void SetUniformFloat(uint loc, float value); @@ -88,15 +86,18 @@ namespace AsuraEngine LUAX_DECL_METHOD(_SetUniformVector3); LUAX_DECL_METHOD(_SetUniformVector4); LUAX_DECL_METHOD(_SetUniformColor); - /// 设置vertex attributes + LUAX_DECL_METHOD(_GetAttributeLocation); LUAX_DECL_METHOD(_SetAttribute); LUAX_DECL_METHOD(_DisableAttribute); - /// 设置内置uniform变量 + LUAX_DECL_METHOD(_SetBuiltInUniforms); //----------------------------------------------------------------------------// + bool CompileVertexShader(const std::string& vert, std::string& outError); + bool CompileFragementShader(const std::string& frag, std::string& outError); + std::string GetProgramWarnings(); std::string GetShaderWarnings(GLuint shader); -- cgit v1.1-26-g67d0