OpenGL一维纹理映射练习

算是抛开书本自己敲了一个完整的渲染代码。

用漫射光强度在一维纹理中索引纹理颜色。所以从顶点转配之后传给片段着色器的是漫射光强度值即可。过这章之后可以考虑着手glsl方向。

可是导航网格的实现还没搞定,我该如何是好?总之,,避免写UI,避免接入无休止的SDK。时至今日,终于明白昔日的老大为何说只在固定的时间发版。因为各种版本的发布耗时耗力缺不能提高技术,能少则免。

要么是在行业中制定SDK协议标准,所有按照该协议标准编写的SDK和被嵌入软件均可实现自动化或一键接入。这么理想化的工作只能在有行业号召力的公司实现,比如触控的anySDK,但是不开源导致接受度低啊。

//vp

#version 330in vec4 vVertex;in vec3 vNormal;uniform mat4 mvMatrix;uniform mat4 mvpMatrix;uniform mat3 normalMatrix;uniform vec3 vLightPosition;smooth out float textureCoordinate;void main(void){//获得表面法线的视觉坐标vec3 vEyeNormal = normalMatrix * vNormal;//获得顶点的视觉坐标,即世界坐标vec4 vPosition4 = mvMatrix * vVertex;vec3 vPosition3 = vPosition4.xyz/vPosition4.w;vec3 vLightDir = normalize(vLightPosition – vPosition3);textureCoordinate = max(0.0f,dot(vLightDir,vEyeNormal));gl_Position = mvpMatrix * vVertex;}

//fp

#version 330smooth in float textureCoordinate;uniform sampler1D colorTable;out vec4 vFragColor;void main(void){vFragColor = texture(colorTable,textureCoordinate);}

//cpp

#include <GLTools.h>#include <GLMatrixStack.h>#include <GLGeometryTransform.h>#include <GLFrustum.h>#include <GLFrame.h>#include <GLTriangleBatch.h>#include <StopWatch.h>#ifdef __APPLE__#include <glut/glut.h>#else#define FREEGLUT_STATIC#include <GL/glut.h>#endifGLMatrixStack modelViewMatrix;GLMatrixStack mvpMatrix;GLMatrixStack projctionMatrix;GLFrustum viewFrustum;GLFrame viewFrame;GLGeometryTransform transformPipeLine;GLTriangleBatch torusBatch;GLuint toonShader;GLuint uiTexture;GLint locMV;GLint locMVP;GLint locNM;GLint locLP;GLint locColorTable;static GLfloat vEyeLight[] = { -100.0f, 100.0f, 100.0f };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);projctionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());transformPipeLine.SetMatrixStacks(modelViewMatrix, projctionMatrix);}void SetupRC(void){glClearColor(0.0f, 0.0f, 0.0f, 1.0f);glEnable(GL_DEPTH_TEST);viewFrame.MoveForward(7.0f);gltMakeTorus(torusBatch, 0.8f, 0.25f, 52, 26);toonShader = gltLoadShaderPairWithAttributes("toonShader.vp", "toonShader.fp", 2, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_NORMAL, "vNormal");locMV = glGetUniformLocation(toonShader, "mvMatrix");locMVP = glGetUniformLocation(toonShader, "mvpMatrix");locNM = glGetUniformLocation(toonShader, "normalMatrix");locLP = glGetUniformLocation(toonShader, "vLightPosition"); locColorTable = glGetUniformLocation(toonShader, "colorTable");glGenTextures(1, &uiTexture);glBindTexture(GL_TEXTURE_1D, uiTexture);GLubyte textureData[4][3] = {32, 0, 0,64, 0, 0,128, 0, 0,255, 0, 0};glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 4, 0, GL_RGB, GL_UNSIGNED_BYTE, textureData);//todoglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);}void RenderScene(void){static CStopWatch rotTimer;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);modelViewMatrix.PushMatrix(viewFrame);{modelViewMatrix.Rotate(rotTimer.GetElapsedSeconds() * 10.f, 0.0f, 1.0f, 0.0f);glUseProgram(toonShader);glUniformMatrix4fv(locMV, 1, GL_FALSE, transformPipeLine.GetModelViewMatrix());glUniformMatrix4fv(locMVP, 1, GL_FALSE, transformPipeLine.GetModelViewProjectionMatrix());glUniformMatrix3fv(locNM, 1, GL_FALSE, transformPipeLine.GetNormalMatrix());glUniform3fv(locLP, 1, vEyeLight);glUniform1i(locColorTable, 0);torusBatch.Draw();}modelViewMatrix.PopMatrix();glutSwapBuffers();glutPostRedisplay();}void ShutdownRC(void){}int main(int argc, char * argv[]){gltSetWorkingDirectory(argv[0]);glutInit(&argc, argv);glutInitDisplayMode(GL_DOUBLE | GL_DEPTH | GL_STENCIL);glutInitWindowSize(800, 600);glutCreateWindow("ToonShader Jingz");glutReshapeFunc(ChangeSize);glutDisplayFunc(RenderScene);GLenum err = glewInit();if (err != GLEW_OK){fprintf(stderr, "GLEW ERROR:%s\n", glewGetErrorString(err));return 1;}SetupRC();glutMainLoop();ShutdownRC();return 0;}

版权声明:本文为博主原创文章,未经博主允许不得转载。

我们一直在旅行,一直在等待某个人可以成为我们旅途的伴侣,

OpenGL一维纹理映射练习

相关文章:

你感兴趣的文章:

标签云: