opengl 贴图颜色失真(慎入)

原创 2012年03月29日 02:54:03

2012.04.19更新:貌似是渲染的时候图片格式出错了,与glPixelStorei(GL_UNPACK_ALIGNMENT, 4)没关系。在glTextImage2D的时候应该用GL_BGR_EXT,而不是GL_RGB.



修改了Nehe的教程(因为aux库的auxDIBImageLoad()不能用了),把auxDIBImageLoad替换成下面的代码(网上找的)

bool LoadTextureEx(LPTSTR szFileName, GLuint &texid)     // Creates Texture From A Bitmap File
{
	HBITMAP hBMP;             // Handle Of The Bitmap
	BITMAP BMP;             // Bitmap Structure

	hBMP=(HBITMAP)LoadImage(GetModuleHandle(NULL), szFileName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE );

	if (!hBMP)              // Does The Bitmap Exist?
		return FALSE;            // If Not Return False

	GetObject(hBMP, sizeof(BMP), &BMP);        // Get The Object
	// hBMP:        Handle To Graphics Object
	// sizeof(BMP): Size Of Buffer For Object Information
	// &BMP:        Buffer For Object Information

	// Typical Texture Generation Using Data From The Bitmap
	glBindTexture(GL_TEXTURE_2D, texid);        // Bind To The Texture ID
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Linear Min Filter
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Linear Mag Filter
	glTexImage2D(GL_TEXTURE_2D, 0, 3, BMP.bmWidth, BMP.bmHeight, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, BMP.bmBits);

	DeleteObject(hBMP);            // Delete The Object

	return TRUE;             // Loading Was Successful
}

结果颜色失真很严重。

后来对比网上的代码,发现少了一句 

glPixelStorei(GL_UNPACK_ALIGNMENT, 4);

bool LoadTextureEx(LPTSTR szFileName, GLuint &texid)     // Creates Texture From A Bitmap File
{
	HBITMAP hBMP;             // Handle Of The Bitmap
	BITMAP BMP;             // Bitmap Structure

	hBMP=(HBITMAP)LoadImage(GetModuleHandle(NULL), szFileName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE );

	if (!hBMP)              // Does The Bitmap Exist?
		return FALSE;            // If Not Return False

	GetObject(hBMP, sizeof(BMP), &BMP);        // Get The Object
	// hBMP:        Handle To Graphics Object
	// sizeof(BMP): Size Of Buffer For Object Information
	// &BMP:        Buffer For Object Information

	glPixelStorei(GL_UNPACK_ALIGNMENT, 4);       // Pixel Storage Mode (Word Alignment / 4 Bytes), 注意这句

	// Typical Texture Generation Using Data From The Bitmap
	glBindTexture(GL_TEXTURE_2D, texid);        // Bind To The Texture ID
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Linear Min Filter
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Linear Mag Filter
	glTexImage2D(GL_TEXTURE_2D, 0, 3, BMP.bmWidth, BMP.bmHeight, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, BMP.bmBits);

	DeleteObject(hBMP);            // Delete The Object

	return TRUE;             // Loading Was Successful
}


问题解决。

(译)OpenGLES2.0 Iphone开发指引:第二部分,纹理贴图

教程截图:     在这个系列教程中,我们的目标是帮助大家揭开OpenGL ES 2.0的神秘面纱,同时给大家提供一个手把手的例子,能带领大家步入OpenGL ES 2.0的开发世...

openGL es2.0 创建纹理灯光球

package com.gzdxid.utils; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.Fl...

opengl贴图与颜色混合

  • 2015年11月20日 16:50
  • 58KB
  • 下载

OpenGL-- Shader 颜色 光照 4 光照贴图 柔光射灯

光照越远,衰减越厉害 衰减算法: 常数项通常是1.0,它的作用是保证分母永远不会比1小,因为它可以利用一定的距离增加亮度,这个结果不会影响到我们所寻找的。 一次项用于与距离值相乘,这会以线性的方...
  • yulinxx
  • yulinxx
  • 2017年05月25日 01:01
  • 353

OpenGL-- Shader 颜色 光照 3 光照贴图 LightMap

光照贴图原理: 用一个图进行纹理贴图,另一张图用于纹理采样进行镜面光照计算...
  • yulinxx
  • yulinxx
  • 2017年05月25日 00:52
  • 362

OpenGL 两个纹理贴图

  • 2015年09月23日 19:26
  • 11.44MB
  • 下载

OpenGL ES绘制3D纹理贴图

最近看了《疯狂android讲义》的图形相关的内容,结合自己的理解,整理了一下。 下图是做出来的3D纹理贴图效果,手指在屏幕滑动时,图片可以随之转动。 要实现一个纹理贴图,很简单,大致需要五步: 1...

android opengl 纹理贴图

  • 2015年01月22日 11:41
  • 78KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:opengl 贴图颜色失真(慎入)
举报原因:
原因补充:

(最多只允许输入30个字)