#include <Windows.h>
#include <GdiPlus.h>
#include "PVRShell.h"
#include "PVRShellAPI.h"
#include <math.h>
#include <stddef.h>
using namespace Gdiplus;
#pragma comment(lib,"gdiplus.lib")
class CLesson2 : public PVRShell
{
public:
virtual bool InitApplication();
virtual bool InitView();
virtual bool ReleaseView();
virtual bool QuitApplication();
virtual bool RenderScene();
protected:
private:
};
bool CLesson2::InitApplication()
{
//_CrtSetBreakAlloc(78);
return true;
}
bool CLesson2::QuitApplication()
{
return true;
}
GLuint uiVerticesVbo = 0;
GLuint uiColoursVbo = 0;
GLuint uiIndexVbo = 0;
GLuint uiVerticesVbo2 = 0;
GLuint m_ui32Texture = 0;
UINT32* GL_TEXTURE_DATA = NULL;
UINT32 GL_TEXTURE_W = 0;
UINT32 GL_TEXTURE_H = 0;
void MyLoadTexture(wchar_t* textureFile)
{
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
CLSID encoderClsid;
EncoderParameters encoderParameters;
ULONG transformation;
UINT width;
UINT height;
Status stat;
// Get a JPEG image from the disk.
Image* image = new Image(textureFile);
Bitmap* pbitMap = (Bitmap*) image;
UINT w= pbitMap->GetWidth();
UINT h = pbitMap->GetHeight();
// UINT size = image->GetPaletteSize();
// printf("The size of the palette is %d bytes.\n", size);
// ColorPalette* palette = (ColorPalette*)malloc(size);
// image->GetPalette(palette, size);
Rect rect(0,0,w,h);
BitmapData* pBitmapData = new BitmapData;
pbitMap->LockBits(&rect,ImageLockModeRead,PixelFormat32bppARGB,pBitmapData);
int offset = pBitmapData->Stride - w *4 ;
BYTE* pByte = (BYTE*)pBitmapData->Scan0;
GL_TEXTURE_DATA = new UINT32[h*w];
int iCount = 0;
for (int i = 0; i < h; i++)
{
for (int j = 0;j < w; j++)
{
GL_TEXTURE_DATA[iCount++] = (pByte[3]<<24) + (pByte[0]<<16) + (pByte[1]<<8) + (pByte[2]);;
//memcpy(GL_TEXTURE_DATA+iCount,pByte,4);
//iCount++;
pByte += 4;
}
pByte += offset;
}
GL_TEXTURE_W = w;
GL_TEXTURE_H = h;
pbitMap->UnlockBits(pBitmapData);
delete image;
delete pBitmapData;
GdiplusShutdown(gdiplusToken);
//LoadBitmap(,"c:\\img\\5.bmp");
}
bool CLesson2::InitView()
{
//增加纹理
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &m_ui32Texture);
/*
int g_i32TexSize = 128;
GLuint* pTexData = new GLuint[g_i32TexSize*g_i32TexSize];
for(int i = 0; i < g_i32TexSize; ++i)
{
for(int j = 0; j < g_i32TexSize; ++j)
{
// Fills the data with a fancy pattern
GLuint col = (255L<<24) + ((255L-j*2)<<16) + ((255L-i)<<8) + (255L-i*2);
if( ((i*j)/8) % 2 )
col = 0xffff00ff;
pTexData[j*g_i32TexSize+i] = col;
}
}
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, g_i32TexSize, g_i32TexSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, pTexData);
*/
MyLoadTexture(L"c:\\img\\9.JPG");
GLuint* pTexData2 = new GLuint[GL_TEXTURE_W*GL_TEXTURE_H];
memcpy(pTexData2,GL_TEXTURE_DATA,GL_TEXTURE_W*GL_TEXTURE_H*4);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, GL_TEXTURE_W,GL_TEXTURE_H, 0, GL_RGBA, GL_UNSIGNED_BYTE, pTexData2);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
/*
glTexCoord2f(0.0f, 0.0f); glVertex3f(-8.0f, -8.0f, 0.0f);
glTexCoord2f(0.0f, 5.0f); glVertex3f(-8.0f, 8.0f, 0.0f);
glTexCoord2f(5.0f, 5.0f); glVertex3f(8.0f, 8.0f, 0.0f);
glTexCoord2f(5.0f, 0.0f); glVertex3f(8.0f, -8.0f, 0.0f);
*/
//Z 字型
float vertices[]= {
-1.0f,1.0f,
0.0,-1.0,
1.0f,1.0f,
1.0,-1.0,
-1.0f,-1.0f,
0.0,0.0,
1.0f,-1.0f,
1.0,0.0
};
glGenBuffers(1, &uiVerticesVbo);
glBindBuffer(GL_ARRAY_BUFFER,uiVerticesVbo);
unsigned int uiSize = 4 * (sizeof(float) * 4);
glBufferData(GL_ARRAY_BUFFER, uiSize, vertices, GL_STATIC_DRAW);
float vertices2[]= {
-0.25,0.25,
0.8,0.8,0.8,0.5,
0.0,-1.0,
0.25,0.25,
0.8,0.8,0.8,0.5,
1.0,-1.0,
-0.25,-0.25,
0.8,0.8,0.8,0.5,
0.0,0.0,
0.25,-0.25,
0.8,0.8,0.8,0.5,
1.0,0.0
};
glGenBuffers(1, &uiVerticesVbo2);
glBindBuffer(GL_ARRAY_BUFFER,uiVerticesVbo2);
uiSize = 4 * (sizeof(float) * 8);
glBufferData(GL_ARRAY_BUFFER, uiSize, vertices2, GL_STATIC_DRAW);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindBuffer(GL_ARRAY_BUFFER,0);
return true;
}
bool CLesson2::ReleaseView()
{
return true;
}
PVRShell * NewDemo(void)
{
return new CLesson2();
}
bool CLesson2::RenderScene()
{
glLoadIdentity();
glClearColor(0.7, 0.7, 0.7, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//glEnable(GL_DEPTH_TEST);
//glDepthMask(GL_TRUE);
//glAlphaFunc(GL_GREATER,0.1f);
glColor4f(1.0, 1.0, 1.0, 1.0);
//glEnable(GL_DEPTH_TEST);
//glDisable(GL_BLEND);
//glDisable(GL_ALPHA_TEST);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER,uiVerticesVbo);
glVertexPointer(2, GL_FLOAT, 4 * sizeof(float), 0);
glTexCoordPointer(2, GL_FLOAT, 4 * sizeof(float), (GLvoid*)(2 * sizeof(float)));
glDrawArrays(GL_TRIANGLE_STRIP,0,4);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
//glDisable(GL_DEPTH_TEST);
//glEnable(GL_ALPHA_TEST);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER,uiVerticesVbo2);
//glPushMatrix();
//glColor4f(0.3f, 0.3f, 0.3f, 0.5f);
//glPopMatrix();
glVertexPointer(2, GL_FLOAT, 8 * sizeof(float), 0);
glColorPointer(4, GL_FLOAT, 8 * sizeof(float), (GLvoid*)(2 * sizeof(float)));
glTexCoordPointer(2, GL_FLOAT, 8 * sizeof(float), (GLvoid*)(6 * sizeof(float)));
glDrawArrays(GL_TRIANGLE_STRIP,0,4);
glDisableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
//glDepthMask(GL_FALSE);
return true;
}
(cr0_3) |