Xcode+Opengl学习(9)利用Uniform配置自己的着色器

  • Glint glGetUniformLocation(GLuint shaderID,const GLchar* varName)
  • void glUniform4fv(Glint location,GLuint count,GLfloat*v)
  • void glUniformMatrix4fv(Glint location,GLuint count,GLboolean transpose,const GLfloat *m)
  • GLuint gltLoadShaderPairWithAttrbutes(const char *szVertexProg,const char *szFragmentProg,…)

main.cpp

#include<GLTools.h>
#include<GLMatrixStack.h>
#include<GLFrame.h>
#include<GLFrustum.h>
#include<GLGeometryTransform.h>
#include<StopWatch.h>
#include<GLUT/GLUT.h>

GLFrame viewFrame;
GLFrustum viewFrustum;
GLTriangleBatch torusBatch;
GLMatrixStack modelViewMatrix;
GLMatrixStack projectionMatrix;
GLGeometryTransform transformPipeline;

GLuint flatShader;

GLint locMVP;
GLint locColor;

void SetupRC()
{
    glClearColor(0.0f,0.0f,0.0f,1.0f);
    
    glEnable(GL_DEPTH_TEST);
    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
    
    viewFrame.MoveForward(4.0f);
    
    gltMakeTorus(torusBatch,0.8f,0.25f,52,26);
    
  flatShader=gltLoadShaderPairWithAttributes("/Users/mac/Downloads/1/FlatShader.vp","/Users/mac/Downloads/1/FlatShader.fp",1,GLT_ATTRIBUTE_VERTEX,"vVertex");
    
    locMVP=glGetUniformLocation(flatShader,"mvpMatrix");
    locColor=glGetUniformLocation(flatShader,"vColorValue");
    
}

void ShutdownRC(void)
{
    
}

void RenderScene(void)
{
    static CStopWatch rotTimer;
    
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    
    modelViewMatrix.PushMatrix(viewFrame);
    modelViewMatrix.Rotate(rotTimer.GetElapsedSeconds()*10.0f,0.0f,1.0f,0.0f);
    
    GLfloat vColor[]={0.0f,1.0f,1.0f,1.0f};
    
    glUseProgram(flatShader);
    glUniform4fv(locColor,1,vColor);
    glUniformMatrix4fv(locMVP,1,GL_FALSE,transformPipeline.GetModelViewProjectionMatrix());
    torusBatch.Draw();
    
    modelViewMatrix.PopMatrix();
    
    glutSwapBuffers();
    glutPostRedisplay();
    
}

void ChangeSize(int w,int h)
{
    if(h==0)
        h=1;
    glViewport(0,0,w,h);
    viewFrustum.SetPerspective(35.0f,float(w)/float(h),1.0f,100.0f);
    
    projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
    transformPipeline.SetMatrixStacks(modelViewMatrix,projectionMatrix);
}

int main(int argc, char* argv[])
{
    gltSetWorkingDirectory(argv[0]);
    
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Simple Transformed Geometry");
    glutReshapeFunc(ChangeSize);
    glutDisplayFunc(RenderScene);
    
    GLenum err = glewInit();
    if (GLEW_OK != err) {
        fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
        return 1;
    }
    
    SetupRC();
    glutMainLoop();
    ShutdownRC();
    return 0;
}



.vp

#version 120

uniform mat4	mvpMatrix;

attribute vec4 vVertex;

void main(void) 
    { 
    gl_Position = mvpMatrix * vVertex;
    }

.fp

#version 120

uniform vec4 vColorValue;

void main(void)
   { 
   gl_FragColor = vColorValue;
   }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值