Xcode+Opengl學習(13)丟棄片段用法——消散discard

.vp

#version 120

attribute vec4 vVertex;
attribute vec3 vNormal;
attribute vec2 vTexCoords0;


uniform mat4   mvpMatrix;
uniform mat4   mvMatrix;
uniform mat3   normalMatrix;
uniform vec3   vLightPosition;

varying vec3 vVaryingNormal;
varying vec3 vVaryingLightDir;
varying vec2 vVaryingTexCoord;

void main(void) 
    {
    vVaryingTexCoord = vTexCoords0;

    vVaryingNormal = normalMatrix * vNormal;

    vec4 vPosition4 = mvMatrix * vVertex;
    vec3 vPosition3 = vPosition4.xyz / vPosition4.w;

    vVaryingLightDir = normalize(vLightPosition - vPosition3);
    
    gl_Position = mvpMatrix * vVertex;
    }

fp

#version 120

 vec4 vFragColor;

uniform vec4       ambientColor;
uniform vec4       diffuseColor;   
uniform vec4       specularColor;
uniform sampler2D  cloudTexture;
uniform float      dissolveFactor;

varying vec3 vVaryingNormal;
varying vec3 vVaryingLightDir;
varying vec2 vVaryingTexCoord;

void main(void)
    { 
    vec4 vCloudSample = texture2D(cloudTexture, vVaryingTexCoord);

    if(vCloudSample.r < dissolveFactor)
        discard;
   
    float diff = max(0.0, dot(normalize(vVaryingNormal), normalize(vVaryingLightDir)));

    vFragColor = diff * diffuseColor;

    vFragColor += ambientColor;

    vec3 vReflection = normalize(reflect(-normalize(vVaryingLightDir), normalize(vVaryingNormal)));
    float spec = max(0.0, dot(normalize(vVaryingNormal), vReflection));
    if(diff != 0.0f) {
        float fSpec = pow(spec, 128.0);
        vFragColor.rgb += vec3(fSpec, fSpec, fSpec);
        }
    gl_FragColor=vFragColor;
    }
    

main.cpp


#include<GLTools.h>
#include<GLMatrixStack.h>
#include<GLFrame.h>
#include<GLFrustum.h>
#include<GLGeometryTransform.h>
#include<StopWatch.h>
#include<math.h>
#include<GLUT/GLUT.h>
#include"loadTGATexture.hpp"

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

GLuint ADSDissloveShader;
GLint locAmbient;
GLint locDiffuse;
GLint locSpecular;
GLint locLight;
GLint locMVP;
GLint locMV;
GLint locNM;
GLint locTexture;
GLint locDissolveFactor;

GLuint cloudTexture;


void SetupRC(void)
{
    glClearColor(0.0f,0.0f,0.0f,1.0f);

    glEnable(GL_DEPTH_TEST);

    viewFrame.MoveForward(4.0f);

    gltMakeTorus(torusBatch,0.80f,0.25f,52,26);

    ADSDissloveShader=gltLoadShaderPairWithAttributes("/Users/mac/Downloads/1/Dissolve.vp","/Users/mac/Downloads/1/Dissolve.fp",3,GLT_ATTRIBUTE_VERTEX,"vVertex",GLT_ATTRIBUTE_NORMAL,"vNormal",GLT_ATTRIBUTE_TEXTURE0,"vTexCoords0");

    locAmbient=glGetUniformLocation(ADSDissloveShader,"ambientColor");
    locDiffuse=glGetUniformLocation(ADSDissloveShader,"diffuseColor");
    locSpecular = glGetUniformLocation(ADSDissloveShader, "specularColor");
    locLight = glGetUniformLocation(ADSDissloveShader, "vLightPosition");
    locMVP = glGetUniformLocation(ADSDissloveShader, "mvpMatrix");
    locMV  = glGetUniformLocation(ADSDissloveShader, "mvMatrix");
    locNM  = glGetUniformLocation(ADSDissloveShader, "normalMatrix");
    locTexture = glGetUniformLocation(ADSDissloveShader, "cloudTexture");
    locDissolveFactor = glGetUniformLocation(ADSDissloveShader, "dissolveFactor");

    glGenTextures(1,&cloudTexture);
    glBindTexture(GL_TEXTURE_1D,cloudTexture);
    LoadTGATexture("/Users/mac/Downloads/1/Clouds.tga",GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE);
}
void ShutdownRC(void)
{
  glDeleteTextures(1,&cloudTexture);
}

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 vEyeLight[] = { -100.0f, 100.0f, 100.0f };
    GLfloat vAmbientColor[] = { 0.1f, 0.1f, 0.1f, 1.0f };
    GLfloat vDiffuseColor[] = { 1.0f, 1.0f, 0.0f, 1.0f };
    GLfloat vSpecularColor[] = { 1.0f, 1.0f, 1.0f, 1.0f };

    glUseProgram(ADSDissloveShader);
    glUniform4fv(locAmbient, 1, vAmbientColor);
    glUniform4fv(locDiffuse, 1, vDiffuseColor);
    glUniform4fv(locSpecular, 1, vSpecularColor);
    glUniform3fv(locLight, 1, vEyeLight);
    glUniformMatrix4fv(locMVP, 1, GL_FALSE, transformPipeline.GetModelViewProjectionMatrix());
    glUniformMatrix4fv(locMV, 1, GL_FALSE, transformPipeline.GetModelViewMatrix());
    glUniformMatrix3fv(locNM, 1, GL_FALSE, transformPipeline.GetNormalMatrix());
    glUniform1i(locTexture, 1);

    float fFactor=fmod(rotTimer.GetElapsedSeconds(),10.0f);//fmod函數,對浮點數進行取模求餘
    fFactor/=10.0f;
    glUniform1f(locDissolveFactor,fFactor);

    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("Help me, I'm melting!");
    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;
}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章