浏览代码

shader: factor the uniform handling logic into platform-independent methods

for both OpenGL and the PS3.
legacy
Sam Hocevar sam 13 年前
父节点
当前提交
7cfcfb2413
共有 4 个文件被更改,包括 63 次插入23 次删除
  1. +7
    -12
      src/debug/quad.cpp
  2. +4
    -11
      src/scene.cpp
  3. +46
    -0
      src/shader/shader.cpp
  4. +6
    -0
      src/shader/shader.h

+ 7
- 12
src/debug/quad.cpp 查看文件

@@ -190,6 +190,9 @@ void DebugQuad::TickDraw(float deltams)
colors[i * 3 + 2] = p.z;
}

/* Our default quad color */
vec4 orange(0.8f, 0.5f, 0.2f, 1.0f);

/* Cheap iterators */
#if !defined __CELLOS_LV2__ && !defined ANDROID_NDK
GLuint *array = data->array;
@@ -207,7 +210,7 @@ void DebugQuad::TickDraw(float deltams)
* Renders an orange square.
*/
#if defined HAVE_GLBEGIN || defined USE_GLEW
glColor3f(0.8f, 0.5f, 0.2f);
glColor3f(orange.x, orange.y, orange.z);
glBegin(GL_TRIANGLES);
glVertex3f(data->aa.x, data->bb.y, 0.0f);
glVertex3f(data->bb.x, data->bb.y, 0.0f);
@@ -428,7 +431,7 @@ void DebugQuad::TickDraw(float deltams)
* Renders an orange square.
*/
#if !defined ANDROID_NDK
glColor4f(0.8f, 0.5f, 0.2f, 1.0f);
glColor4f(orange.x, orange.y, orange.z, orange.w);
glEnableClientState(GL_VERTEX_ARRAY);

glVertexPointer(3, GL_FLOAT, 0, data->GetVertexArray());
@@ -574,12 +577,8 @@ void DebugQuad::TickDraw(float deltams)
uni[0] = shader[0]->GetUniformLocation("in_Color");
}
shader[0]->Bind();
shader[0]->SetUniform(uni[0], orange);
shader++;
#if !defined __CELLOS_LV2__
glUniform4f(uni[0], 0.8f, 0.5f, 0.2f, 1.0f);
#else
cgGLSetParameter4f((CGparameter)(intptr_t)uni[0], 0.8f, 0.5f, 0.2f, 1.0f);
#endif
uni++;

glEnableClientState(GL_VERTEX_ARRAY);
@@ -691,12 +690,8 @@ void DebugQuad::TickDraw(float deltams)
uni[0] = shader[0]->GetUniformLocation("in_Matrix");
}
shader[0]->Bind();
shader[0]->SetUniform(uni[0], t2);
shader++;
#if !defined __CELLOS_LV2__
glUniformMatrix4fv(uni[0], 1, GL_FALSE, &t2[0][0]);
#else
cgGLSetMatrixParameterfc((CGparameter)(intptr_t)uni[0], &t2[0][0]);
#endif
uni++;

glEnableClientState(GL_VERTEX_ARRAY);


+ 4
- 11
src/scene.cpp 查看文件

@@ -266,24 +266,17 @@ void Scene::Render() // XXX: rename to Blit()

stdshader->Bind();

#if !defined __CELLOS_LV2__
uni_mat = stdshader->GetUniformLocation("proj_matrix");
glUniformMatrix4fv(uni_mat, 1, GL_FALSE, &Video::GetProjMatrix()[0][0]);
stdshader->SetUniform(uni_mat, Video::GetProjMatrix());
uni_mat = stdshader->GetUniformLocation("view_matrix");
glUniformMatrix4fv(uni_mat, 1, GL_FALSE, &Video::GetViewMatrix()[0][0]);
stdshader->SetUniform(uni_mat, Video::GetViewMatrix());
uni_mat = stdshader->GetUniformLocation("model_matrix");
glUniformMatrix4fv(uni_mat, 1, GL_FALSE, &data->model_matrix[0][0]);
stdshader->SetUniform(uni_mat, data->model_matrix);

#if !defined __CELLOS_LV2__
uni_tex = stdshader->GetUniformLocation("in_Texture");
glUniform1i(uni_tex, 0);
#else
uni_mat = stdshader->GetUniformLocation("proj_matrix");
cgGLSetMatrixParameterfc((CGparameter)(intptr_t)uni_mat, &Video::GetProjMatrix()[0][0]);
uni_mat = stdshader->GetUniformLocation("view_matrix");
cgGLSetMatrixParameterfc((CGparameter)(intptr_t)uni_mat, &Video::GetViewMatrix()[0][0]);
uni_mat = stdshader->GetUniformLocation("model_matrix");
cgGLSetMatrixParameterfc((CGparameter)(intptr_t)uni_mat, &data->model_matrix[0][0]);

// WTF? this doesn't exist
//uni_tex = stdshader->GetUniformLocation("in_Texture");
//cgGLSetParameter1i((CGparameter)(intptr_t)uni_tex, 0);


+ 46
- 0
src/shader/shader.cpp 查看文件

@@ -186,6 +186,52 @@ int Shader::GetUniformLocation(char const *uni) const
#endif
}

void Shader::SetUniform(int uni, float f)
{
#if !defined __CELLOS_LV2__
glUniform1f(uni, f);
#else
cgGLSetParameter1f((CGparameter)(intptr_t)uni, f);
#endif
}

void Shader::SetUniform(int uni, vec2 const &v)
{
#if !defined __CELLOS_LV2__
glUniform2f(uni, v.x, v.y);
#else
cgGLSetParameter2f((CGparameter)(intptr_t)uni, v.x, v.y);
#endif
}

void Shader::SetUniform(int uni, vec3 const &v)
{
#if !defined __CELLOS_LV2__
glUniform3f(uni, v.x, v.y, v.z);
#else
cgGLSetParameter3f((CGparameter)(intptr_t)uni, v.x, v.y, v.z);
#endif
}

void Shader::SetUniform(int uni, vec4 const &v)
{
/* FIXME: use the array versions of these functions */
#if !defined __CELLOS_LV2__
glUniform4f(uni, v.x, v.y, v.z, v.w);
#else
cgGLSetParameter4f((CGparameter)(intptr_t)uni, v.x, v.y, v.z, v.w);
#endif
}

void Shader::SetUniform(int uni, mat4 const &m)
{
#if !defined __CELLOS_LV2__
glUniformMatrix4fv(uni, 1, GL_FALSE, &m[0][0]);
#else
cgGLSetMatrixParameterfc((CGparameter)(intptr_t)uni, &m[0][0]);
#endif
}

void Shader::Bind() const
{
#if !defined __CELLOS_LV2__


+ 6
- 0
src/shader/shader.h 查看文件

@@ -28,7 +28,13 @@ public:
static void Destroy(Shader *shader);

int GetAttribLocation(char const *attr) const;

int GetUniformLocation(char const *uni) const;
void SetUniform(int uni, float f);
void SetUniform(int uni, vec2 const &v);
void SetUniform(int uni, vec3 const &v);
void SetUniform(int uni, vec4 const &v);
void SetUniform(int uni, mat4 const &m);

void Bind() const;



正在加载...
取消
保存