GLSL逐个像素光照的问题(解决了,更新显卡驱动和GLEW就行了)

本文探讨了在实现逐像素光照效果时遇到的问题,并详细分析了代码中的光照配置及着色器应用,最终通过调整参数成功实现了预期的镜面高光效果。

我采用了这组着色器,

http://blog.csdn.net/hippig/article/details/7484931

作用是使用逐像素光照,但是在实际的应用程序中却出现了错误的效果。

使用逐个像素光照应该出现如第一图均匀的镜面高光。




但在我的程序中没有出现镜面高光,旋转后发现只有壶把和壶嘴上有,这是为什么?



代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <GL/glew.h>

#include <GL/glut.h>

#include "textfile.h"
#include "bitmap.h"



int        Width;    /* Width of window */
int        Height;   /* Height of window */
int        option = 0; 
BITMAPINFO *TexInfo; /* Texture bitmap information */
GLubyte    *TexBits; /* Texture bitmap pixel bits */
GLuint p ;
GLint samplerA,samplerB;
GLuint texname[2];

GLint loc,texloc;
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;

float lpos[4] = {1.0,1.0,1.0,0.0};



void changeSize(int w, int h)
{
	GLfloat nRange = 2.0f;

	if(h == 0)
		h = 1;


	glViewport(0, 0, w, h);


	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();


	if (w <= h) 
		glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
	else 
		glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);

	//gluPerspective(60.0,h/w,1,400);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}



void SpecialKeys(int key, int x, int y)
{
	if(key == GLUT_KEY_UP)
		xRot-=5.0f;

	if(key == GLUT_KEY_DOWN)
		xRot +=5.0f;

	if(key == GLUT_KEY_LEFT)
		yRot -=5.0f;

	if(key == GLUT_KEY_RIGHT)
		yRot +=5.0f;

	if(key > 356.0f)
		xRot = 0.0f;

	if(key < -1.0f)
		xRot = 355.0f;

	if(key > 356.0f)
		yRot = 0.0f;

	if(key < -1.0f)
		yRot = 355.0f;

	glutPostRedisplay();
}

void processNormalKeys(unsigned char key, int x, int y) {

	if (key == 27) 
		exit(0);
}

#define printOpenGLError() printOglError(__FILE__, __LINE__)



void setShaders2() {
	GLuint v1,f1,f12;

	char *vs1 = NULL,*fs1 = NULL,*fs2 = NULL;

	v1 = glCreateShader(GL_VERTEX_SHADER);
	f1 = glCreateShader(GL_FRAGMENT_SHADER);
	f12 = glCreateShader(GL_FRAGMENT_SHADER);

	vs1 = textFileRead("pixvs.txt");
	fs1 = textFileRead("pixfs.txt");

 	const char * vv = vs1;
	const char * ff = fs1;

	glShaderSource(v1, 1, &vv,NULL);
	glShaderSource(f1, 1, &ff,NULL);

	free(vs1);free(fs1);

	glCompileShader(v1);
	glCompileShader(f1);


	p = glCreateProgram();
	glAttachShader(p,v1);
	glAttachShader(p,f1);

	glLinkProgram(p);
	printProgramInfoLog(p);

	glUseProgram(p);


}
void init2(void)//在这里设置光照属性
{	
	GLfloat mat_spec[]={1.0,1.0,1.0,1.0};
	GLfloat mat_shin[]={100.0};
	GLfloat lightpos[]={.0,.0,1.0,.0};
	GLfloat white_light[]={1.0,1.0,1.0,.0};
//	GLfloat lmodel_ambient[]={0.1,0.1,0.1,1.0};
	glClearColor(0,0,0,0);
	glShadeModel(GL_SMOOTH);
	glMaterialfv(GL_FRONT,GL_SPECULAR,mat_spec);
	glMaterialfv(GL_FRONT,GL_SHININESS,mat_shin);
	glLightfv(GL_LIGHT0,GL_POSITION,lightpos);
	glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light);
	glLightfv(GL_LIGHT0,GL_SPECULAR,white_light);
//	glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);;
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glEnable(GL_DEPTH_TEST);
	//glEnable(GL_NORMALIZE);
//	glEnable(GL_COLOR_MATERIAL);
	//	glEnable(GL_AUTO_NORMAL);
}
void display(void)
{	GLfloat pos[]={1.0,1.0,1.0,1.0};
GLfloat norm3[3];

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef((GLfloat)xRot,1,0,0);
glRotatef((GLfloat)yRot,0,1,0);
glutSolidTeapot(0.5);
glPopMatrix();

glutSwapBuffers();


}

int main(int argc, char **argv) {
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
	glutInitWindowPosition(100,100);
	glutInitWindowSize(800,600);
	glutCreateWindow("DEMO");
	glutDisplayFunc(display);
	glutReshapeFunc(changeSize);
	glutSpecialFunc(SpecialKeys);
	glutKeyboardFunc(processNormalKeys);
	init2();
	glewInit();
	if (glewIsSupported("GL_VERSION_2_0"))
		printf("Ready for OpenGL 2.0\n");
	else {
		printf("OpenGL 2.0 not supported\n");
				exit(1);
	}
	//setup();
	setShaders2();
	glutMainLoop();

	return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值