#include <Windows.h>
#include "ximage.h"
#include <GL/glut.h>
#include <GL/glext.h>
#include <fstream>
using namespace std;
#pragma comment(lib, "glut32.lib")
#pragma comment(lib, "winmm.lib")
// FrameBuffer (FBO) gen, bin and texturebind
PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT ;
PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT ;
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT ;
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT ;
// Shader functions
PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB ;
PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB ;
PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB ;
PFNGLSHADERSOURCEARBPROC glShaderSourceARB ;
PFNGLCOMPILESHADERARBPROC glCompileShaderARB ;
PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB ;
PFNGLATTACHOBJECTARBPROC glAttachObjectARB ;
PFNGLLINKPROGRAMARBPROC glLinkProgramARB ;
PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB ;
PFNGLUNIFORM1IARBPROC glUniform1iARB ;
PFNGLUNIFORM1FARBPROC glUniform1fARB ;
PFNGLUNIFORM2FARBPROC glUniform2fARB ;
PFNGLUNIFORM4FARBPROC glUniform4fARB ;
PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fARB ;
PFNGLACTIVETEXTUREARBPROC glActiveTextureARB ;
PFNGLGETINFOLOGARBPROC glGetInfoLogARB ;
PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT ;
void getOpenGLFunctionPointers(void)
{
// FBO
glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)wglGetProcAddress("glActiveTextureARB");
glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) wglGetProcAddress("glGenFramebuffersEXT");
glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) wglGetProcAddress("glBindFramebufferEXT");
glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)wglGetProcAddress("glFramebufferTexture2DEXT");
glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)wglGetProcAddress("glCheckFramebufferStatusEXT");
//Shaders
glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)wglGetProcAddress("glCreateProgramObjectARB");
glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)wglGetProcAddress("glUseProgramObjectARB");
glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)wglGetProcAddress("glCreateShaderObjectARB");
glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)wglGetProcAddress("glShaderSourceARB");
glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)wglGetProcAddress("glCompileShaderARB");
glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)wglGetProcAddress("glGetObjectParameterivARB");
glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)wglGetProcAddress("glAttachObjectARB");
glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)wglGetProcAddress("glGetInfoLogARB");
glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)wglGetProcAddress("glLinkProgramARB");
glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)wglGetProcAddress("glGetUniformLocationARB");
glUniform1iARB = (PFNGLUNIFORM1IARBPROC)wglGetProcAddress("glUniform1iARB");
glUniform1fARB = (PFNGLUNIFORM1FARBPROC)wglGetProcAddress("glUniform1fARB");
// Use by blur shader
glUniform2fARB = (PFNGLUNIFORM2FARBPROC)wglGetProcAddress("glUniform2fARB");
glUniform4fARB = (PFNGLUNIFORM4FARBPROC)wglGetProcAddress("glUniform4fARB");
glUniformMatrix4fARB = (PFNGLUNIFORMMATRIX4FVARBPROC)wglGetProcAddress("glUniformMatrix4fARB");
// Used during color depth filtering
glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC)wglGetProcAddress("glGenerateMipmapEXT");
}
// Expressed as float so gluPerspective division returns a float and not 0 (640/480 != 640.0/480.0).
#define RENDER_WIDTH (512)
#define RENDER_HEIGHT (512)
#define SHADOW_MAP_COEF 0.5
#define BLUR_COEF 0.25
//Camera position
float p_camera[4] = {0,20,40,1};
//Camera lookAt
float l_camera[3] = {0,0,-2};
//Light position
float p_light[4] = {-6,10,6,1};
//Light lookAt
float l_light[3] = {0,0,0};
//Light mouvement circle radius
float light_mvnt = 20.0f;
// Z values will be rendered to this texture when using fboId framebuffer
GLuint depthTextureId;
// Use to activate/disable shadowShader
GLhandleARB shadowShaderId;
GLuint shadowMapUniform;
GLuint SceneTexUniform;
GLuint LightDirUniform;
GLuint LightPosUniform;
GLuint EyePosUniform;
GLuint matWorldUniform;
// Used to store values during the first pass
GLuint storeMomentsShader;
GLuint textureID;
void SaveImage(const char *lpFileName, int nWidth, int nHeight, unsigned char *lpBits)
{
BITMAPINFO bi;//信息头
void *pBits=NULL;
//填充信息头
ZeroMemory(&bi,sizeof(bi));
bi.bmiHeader.biSize=sizeof(bi.bmiHeader);
bi.bmiHeader.biHeight=nHeight;
bi.bmiHeader.biWidth=nWidth;
bi.bmiHeader.biPlanes=1;
bi.bmiHeader.biBitCount=24;
bi.bmiHeader.biCompression=BI_RGB;
bi.bmiHeader.biSizeImage=3*nWidth*nHeight;
BITMAPFILEHEADER bmfHeader;
ZeroMemory(&bmfHeader,sizeof(bmfHeader));
bmfHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
bmfHeader.bfSize=bi.bmiHeader.biSizeImage+bmfHeader.bfOffBits;
bmfHeader.bfType= (WORD)'MB';
fstream out;
out.open(lpFileName, ios::out);
out.write((char*)&bmfHeader,sizeof(bmfHeader));
out.write((char*)&bi.bmiHeader,sizeof(bi.bmiHeader));
out.write((char*)lpBits,bi.bmiHeader.biSizeImage);
out.close();
// HANDLE hFile=CreateFile(lpFileName,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
// if(hFile!=INVALID_HANDLE_VALUE)
// {
// DWORD dwRet=0;
// //填充文件头
// BITMAPFILEHEADER bmfHeader;
// ZeroMemory(&bmfHeader,sizeof(bmfHeader));
// bmfHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
// bmfHeader.bfSize=bi.bmiHeader.biSizeImage+bmfHeader.bfOffBits;
// bmfHeader.bfType='MB';
// WriteFile(hFile,&bmfHeader,sizeof(bmfHeader),&dwRet,NULL);
// WriteFile(hFile,&bi.bmiHeader,sizeof(bi.bmiHeader),&dwRet,NULL);
// WriteFile(hFile,lpBits,bi.bmiHeader.biSizeImage,&dwRet,NULL);
// CloseHandle(hFile);
// }
}
bool SaveShadowMap(const char *lpFileName,int Width, int Height)
{
int expand = 0;
if(0 != (Width *3)%4)
{
expand = 4 - (Width*3)%4; //保证位图宽度能被4整除
}
int TrueWidth = Width*3 +expand;
int mapSize = (TrueWidth) * (Height);
if(mapSize == 0)
{
return false;
}
unsigned char * pTmp = NULL;
if(NULL == (pTmp = new BYTE[mapSize]))
{
return false;
}
memset(pTmp, '\0', mapSize);
// 读取屏幕像素
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glReadPixels(0, 0, Width, Height, GL_BGR_EXT, GL_UNSIGNED_BYTE, pTmp);
// BMP信息头
// CxImage image;
// image.CreateFromArray(pTmp, Width, Height, 24, TrueWidth,false);
// //image.SetJpegQuality(98); //指定JPG文件的质量(0-100)
// image.Save(lpFileName, CXIMAGE_FORMAT_BMP);
SaveImage(lpFileName, Width, Height, pTmp);
if(NULL != pTmp)
{
delete[] pTmp;
pTmp = NULL;
}
return true;
}
// Loading shader function
GLhandleARB loadShader(char* filename, unsigned int type)
{
FILE *pfile;
GLhandleARB handle;
const GLcharARB* files[1];
// shader Compilation variable
GLint result; // Compilation code result
GLint errorLoglength ;
char* errorLogText;
GLsizei actualErrorLogLength;
char buffer[400000];
memset(buffer,0,400000);
// This will raise a warning on MS compiler
pfile = fopen(filename, "rb");
if(!pfile)
{
printf("Sorry, can't open file: '%s'.\n", filename);
exit(0);
}
fread(buffer,sizeof(char),400000,pfile);
//printf("%s\n",buffer);
fclose(pfile);
handle = glCreateShaderObjectARB(type);
if (!handle)
{
//We have failed creating the vertex shader object.
printf("Failed creating vertex shader object from file: %s.",filename);
exit(0);
}
files[0] = (const GLcharARB*)buffer;
glShaderSourceARB(
handle, //The handle to our shader
1, //The number of file
没有合适的资源?快使用搜索试试~ 我知道了~
GL_ShadowMap phong
共10个文件
h:4个
suo:1个
jpg:1个
3星 · 超过75%的资源 需积分: 12 18 下载量 137 浏览量
2011-04-23
21:49:53
上传
评论
收藏 518KB ZIP 举报
温馨提示
GL_ShadowMap phong gl简单的实现ShadowMap, 使用glsl生成ShadowMap和渲染
资源推荐
资源详情
资源评论
收起资源包目录
GL_ShadowMap+phong.zip (10个子文件)
GL_ShadowMap+phong
GL_ShadowMap.sln 2KB
GL_ShadowMap
main.cpp 18KB
StoreDepthVertexShader.h 105B
ShadowMap.bmp 768KB
VertexShader.h 425B
FragmentShader.h 2KB
GL_ShadowMap.vcproj 5KB
Plane.jpg 498KB
StoreDepthFragmentShader.h 478B
GL_ShadowMap.suo 48KB
共 10 条
- 1
资源评论
- lh2582014-01-01作为学习OpenGL还是有点用的
- ganli402012-06-15网上比较老的东西,功能实现了,但已经没什么价值了
QuYuanTech
- 粉丝: 7
- 资源: 46
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功