From 200f710983fd54b23437cb78d5a03c90b5a47523 Mon Sep 17 00:00:00 2001 From: chai Date: Tue, 9 Apr 2019 09:02:22 +0800 Subject: *misc --- source/modules/asura-core/graphics/shader.cpp | 37 ++++++++++---- source/modules/asura-core/graphics/shader.h | 74 +++++++++++++++++++++------ 2 files changed, 87 insertions(+), 24 deletions(-) (limited to 'source/modules/asura-core/graphics') diff --git a/source/modules/asura-core/graphics/shader.cpp b/source/modules/asura-core/graphics/shader.cpp index 662ce5e..0d92c60 100644 --- a/source/modules/asura-core/graphics/shader.cpp +++ b/source/modules/asura-core/graphics/shader.cpp @@ -15,10 +15,20 @@ namespace AsuraEngine /// static int _texture_unit = 0; - const char* Shader::ASLSemantics[] = { - "asura_model_matrix", // BUILTIN_UNIFORM_MODEL_MATRIX - "asura_view_matrix", // BUILTIN_UNIFORM_VIEW_MATRIX - "asura_projection_matrix", // BUILTIN_UNIFORM_PROJECTION_MATRIX + const char* Shader::SemanticsName[] = { + // uniforms + "asura_model_matrix", + "asura_view_matrix", + "asura_projection_matrix", + // attributes + "asura_position", + "asura_tangent", + "asura_normal", + "asura_texcoord0", + "asura_texcoord1", + "asura_texcoord2", + "asura_texcoord3", + "asura_color" }; Shader::Shader() @@ -98,9 +108,18 @@ namespace AsuraEngine } // 获得mvp的location - mMVP[MATRIX_MODE_MODEL] = glGetUniformLocation(mProgram, ASLSemantics[BUILTIN_UNIFORM_MODEL_MATRIX]); - mMVP[MATRIX_MODE_VIEW] = glGetUniformLocation(mProgram, ASLSemantics[BUILTIN_UNIFORM_VIEW_MATRIX]); - mMVP[MATRIX_MODE_PROJECTION] = glGetUniformLocation(mProgram, ASLSemantics[BUILTIN_UNIFORM_PROJECTION_MATRIX]); + mMVP[MATRIX_MODE_MODEL] = glGetUniformLocation(mProgram, SemanticsName[SEMANTICS_UNIFORM_MODEL_MATRIX]); + mMVP[MATRIX_MODE_VIEW] = glGetUniformLocation(mProgram, SemanticsName[SEMANTICS_UNIFORM_VIEW_MATRIX]); + mMVP[MATRIX_MODE_PROJECTION] = glGetUniformLocation(mProgram, SemanticsName[SEMANTICS_UNIFORM_PROJECTION_MATRIX]); + + mPosition = glGetAttribLocation(mProgram, SemanticsName[SEMANTICS_ATTRIBUTE_POSITION]); + mTangent = glGetAttribLocation(mProgram, SemanticsName[SEMANTICS_ATTRIBUTE_TANGENT]); + mNormal = glGetAttribLocation(mProgram, SemanticsName[SEMANTICS_ATTRIBUTE_NORMAL]); + mTexcoord0 = glGetAttribLocation(mProgram, SemanticsName[SEMANTICS_ATTRIBUTE_TEXCOORD0]); + mTexcoord1 = glGetAttribLocation(mProgram, SemanticsName[SEMANTICS_ATTRIBUTE_TEXCOORD1]); + mTexcoord2 = glGetAttribLocation(mProgram, SemanticsName[SEMANTICS_ATTRIBUTE_TEXCOORD2]); + mTexcoord3 = glGetAttribLocation(mProgram, SemanticsName[SEMANTICS_ATTRIBUTE_TEXCOORD3]); + mColor = glGetAttribLocation(mProgram, SemanticsName[SEMANTICS_ATTRIBUTE_COLOR]); return true; } @@ -115,13 +134,13 @@ namespace AsuraEngine { _texture_unit = 0; } - +/* int Shader::GetAttributeLocation(const std::string& name) { GLint loc = glGetAttribLocation(mProgram, name.c_str()); return loc; } - +*/ uint Shader::GetUniformLocation(const std::string& uniform) { GLint loc = glGetUniformLocation(mProgram, uniform.c_str()); diff --git a/source/modules/asura-core/graphics/shader.h b/source/modules/asura-core/graphics/shader.h index 12d2f59..25b36dc 100644 --- a/source/modules/asura-core/graphics/shader.h +++ b/source/modules/asura-core/graphics/shader.h @@ -24,15 +24,6 @@ namespace AsuraEngine namespace Graphics { - enum BuiltInUniforms - { - BUILTIN_UNIFORM_MODEL_MATRIX = 0, - BUILTIN_UNIFORM_VIEW_MATRIX, - BUILTIN_UNIFORM_PROJECTION_MATRIX, - - BUILTIN_UNIFORM_COUNT - }; - /// /// 一个shader是一个在材质间共享的程序。Shader本身不保存uniforms和顶点数据,只提供设置 /// uniforms和use着色器的方法。编辑器针对每个shader,会通过shader代码找到声明的uniforms @@ -48,7 +39,7 @@ namespace AsuraEngine ~Shader(); - bool Load(const std::string& vert, const std::string& frag); + bool Load(const std::string& vert, const std::string& frag) ASURA_THROW(Exception); void OnUse(); void OnUnuse(); @@ -56,9 +47,21 @@ namespace AsuraEngine /// /// 设置顶点属性,Asura只支持2维顶点数据 /// - int GetAttributeLocation(const std::string& name); - void SetAttribute(int loc, void* data, uint offset = 0, uint stride = 0); - void SetAttribute(int loc, GPUBuffer* vbo, uint offset = 0, uint stride = 0); + //int GetAttributeLocation(const std::string& name); + //void SetAttribute(int loc, void* data, uint offset = 0, uint stride = 0); + //void SetAttribute(int loc, GPUBuffer* vbo, uint offset = 0, uint stride = 0); + + /// + /// 绘制前设置顶点属性 + /// + void SetAttribPosition(int size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer); + void SetAttribTangent(int size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer); + void SetAttribNormal(int size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer); + void SetAttribTexcoord0(int size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer); + void SetAttribTexcoord1(int size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer); + void SetAttribTexcoord2(int size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer); + void SetAttribTexcoord3(int size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer); + void SetAttribColor(int size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer); /// /// 设置uniform变量 @@ -113,11 +116,39 @@ namespace AsuraEngine std::string GetProgramWarnings(); std::string GetShaderWarnings(GLuint shader); - + + /// + /// AsuraShader的语义,包含顶点属性和uniform变量。在framework中会对shader做封装。 + /// 所谓的语义,指shader自定义的变量,和外部程序交互时,需要提供这些变量值,满足基本 + /// 的绘制需要。这里用来索引语义名。 + /// + enum ASLSemantics + { + // MVP矩阵 + SEMANTICS_UNIFORM_MODEL_MATRIX = 0, + SEMANTICS_UNIFORM_VIEW_MATRIX, + SEMANTICS_UNIFORM_PROJECTION_MATRIX, + // 坐标 + SEMANTICS_ATTRIBUTE_POSITION, + // 切线 + SEMANTICS_ATTRIBUTE_TANGENT, + // 法线 + SEMANTICS_ATTRIBUTE_NORMAL, + // 顶点UV + SEMANTICS_ATTRIBUTE_TEXCOORD0, + SEMANTICS_ATTRIBUTE_TEXCOORD1, + SEMANTICS_ATTRIBUTE_TEXCOORD2, + SEMANTICS_ATTRIBUTE_TEXCOORD3, + // 顶点颜色 + SEMANTICS_ATTRIBUTE_COLOR, + + SEMANTICS_COUNT + }; + /// /// Asura shader 语义字符串统一管理。 /// - static const char* ASLSemantics[BUILTIN_UNIFORM_COUNT]; + static const char* SemanticsName[SEMANTICS_COUNT]; GLuint mProgram; GLuint mVertShader; @@ -133,6 +164,19 @@ namespace AsuraEngine /// GLint mMVP[3]; + /// + /// 顶点属性的location + /// + GLint mPosition; + GLint mTangent; + GLint mNormal; + GLint mColor; + // 支持四套UV + GLint mTexcoord0; + GLint mTexcoord1; + GLint mTexcoord2; + GLint mTexcoord3; + }; } -- cgit v1.1-26-g67d0