summaryrefslogtreecommitdiff
path: root/source/modules/asura-core/graphics/shader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/modules/asura-core/graphics/shader.cpp')
-rw-r--r--source/modules/asura-core/graphics/shader.cpp112
1 files changed, 95 insertions, 17 deletions
diff --git a/source/modules/asura-core/graphics/shader.cpp b/source/modules/asura-core/graphics/shader.cpp
index 0d92c60..cf3d4b2 100644
--- a/source/modules/asura-core/graphics/shader.cpp
+++ b/source/modules/asura-core/graphics/shader.cpp
@@ -13,7 +13,7 @@ namespace AsuraEngine
///
/// texture unit
///
- static int _texture_unit = 0;
+ static int _texture_unit;
const char* Shader::SemanticsName[] = {
// uniforms
@@ -107,19 +107,8 @@ namespace AsuraEngine
throw Exception("Link shader program failed:\n%s", warnning.c_str());
}
- // mvplocation
- 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]);
+ // linklocations
+ UpdateSemanticsLocations();
return true;
}
@@ -127,12 +116,20 @@ namespace AsuraEngine
void Shader::OnUse()
{
_texture_unit = 0;
- SetBuiltInUniforms();
+ // Disableöԣsetʱ
+ glDisableVertexAttribArray(mPosition);
+ glDisableVertexAttribArray(mTangent);
+ glDisableVertexAttribArray(mNormal);
+ glDisableVertexAttribArray(mColor);
+ glDisableVertexAttribArray(mTexcoord0);
+ glDisableVertexAttribArray(mTexcoord1);
+ glDisableVertexAttribArray(mTexcoord2);
+ glDisableVertexAttribArray(mTexcoord3);
}
void Shader::OnUnuse()
{
- _texture_unit = 0;
+ _texture_unit;
}
/*
int Shader::GetAttributeLocation(const std::string& name)
@@ -223,7 +220,7 @@ namespace AsuraEngine
uint Shader::GetGLTextureUnitCount()
{
- GLint maxTextureUnits = 0;
+ GLint maxTextureUnits;
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
return (uint)maxTextureUnits;
}
@@ -268,5 +265,86 @@ namespace AsuraEngine
return warnings;
}
+ void Shader::UpdateSemanticsLocations()
+ {
+ // mvplocation
+ 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]);
+ }
+
+ void Shader::SetAttribPosition(int size, GPUBuffer* vbo, GLsizei offset, GLsizei stride , bool normalized)
+ {
+ vbo->Bind();
+ glVertexAttribPointer(mPosition, size, vbo->GetDataType(), normalized, stride, (GLvoid*)offset);
+ vbo->UnBind();
+ glEnableVertexAttribArray(mPosition);
+ }
+
+ void Shader::SetAttribTangent(int size, GPUBuffer* vbo, GLsizei offset, GLsizei stride , bool normalized)
+ {
+ vbo->Bind();
+ glVertexAttribPointer(mTangent, size, vbo->GetDataType(), normalized, stride, (GLvoid*)offset);
+ vbo->UnBind();
+ glEnableVertexAttribArray(mTangent);
+ }
+
+ void Shader::SetAttribNormal(int size, GPUBuffer* vbo, GLsizei offset, GLsizei stride , bool normalized)
+ {
+ vbo->Bind();
+ glVertexAttribPointer(mNormal, size, vbo->GetDataType(), normalized, stride, (GLvoid*)offset);
+ vbo->UnBind();
+ glEnableVertexAttribArray(mNormal);
+ }
+
+ void Shader::SetAttribColor(int size, GPUBuffer* vbo, GLsizei offset, GLsizei stride , bool normalized)
+ {
+ vbo->Bind();
+ glVertexAttribPointer(mColor, size, vbo->GetDataType(), normalized, stride, (GLvoid*)offset);
+ vbo->UnBind();
+ glEnableVertexAttribArray(mColor);
+ }
+
+ void Shader::SetAttribTexcoord0(int size, GPUBuffer* vbo, GLsizei offset, GLsizei stride , bool normalized)
+ {
+ vbo->Bind();
+ glVertexAttribPointer(mTexcoord0, size, vbo->GetDataType(), normalized, stride, (GLvoid*)offset);
+ vbo->UnBind();
+ glEnableVertexAttribArray(mTexcoord0);
+ }
+
+ void Shader::SetAttribTexcoord1(int size, GPUBuffer* vbo, GLsizei offset, GLsizei stride , bool normalized)
+ {
+ vbo->Bind();
+ glVertexAttribPointer(mTexcoord1, size, vbo->GetDataType(), normalized, stride, (GLvoid*) offset);
+ vbo->UnBind();
+ glEnableVertexAttribArray(mTexcoord1);
+ }
+
+ void Shader::SetAttribTexcoord2(int size, GPUBuffer* vbo, GLsizei offset, GLsizei stride , bool normalized)
+ {
+ vbo->Bind();
+ glVertexAttribPointer(mTexcoord2, size, vbo->GetDataType(), normalized, stride, (GLvoid*)offset);
+ vbo->UnBind();
+ glEnableVertexAttribArray(mTexcoord2);
+ }
+
+ void Shader::SetAttribTexcoord3(int size, GPUBuffer* vbo, GLsizei offset, GLsizei stride , bool normalized)
+ {
+ vbo->Bind();
+ glVertexAttribPointer(mTexcoord3, size, vbo->GetDataType(), normalized, stride, (GLvoid*)offset);
+ vbo->UnBind();
+ glEnableVertexAttribArray(mTexcoord3);
+ }
+
}
} \ No newline at end of file