标签:opengl
算是抛开书本自己敲了一个完整的渲染代码。
用漫射光强度在一维纹理中索引纹理颜色。所以从顶点转配之后传给片段着色器的是漫射光强度值即可。过这章之后可以考虑着手glsl方向。
可是导航网格的实现还没搞定,我该如何是好?总之,避免写UI,避免接入无休止的SDK。时至今日,终于明白昔日的老大为何说只在固定的时间发版。因为各种版本的发布耗时耗力缺不能提高技术,能少则免。
要么是在行业中制定SDK协议标准,所有按照该协议标准编写的SDK和被嵌入软件均可实现自动化或一键接入。这么理想化的工作只能在有行业号召力的公司实现,比如触控的anySDK,但是不开源导致接受度低啊。
//vp
#version 330 in 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 330 smooth 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> #endif GLMatrixStack 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); //todo glTexParameteri(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
原文地址:http://blog.csdn.net/jingzhewangzi/article/details/46861575