我正在尝试将我的游戏引擎从win / linux移植到mac os x,所有工作都很好,除了纹理。我使用SOIL加载纹理和GLSL着色器进行渲染,所有这些都是用C ++完成的。
我相信我的着色器工作正常:
gl_FragColor = texture2D(BSTextureUnit,textureCoordinates)* BSTextureColor;
这是我如何加载纹理:
theTextureId = SOIL_load_OGL_texture
(
nameChar,
SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,
SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
);
glBindTexture(GL_TEXTURE_2D, theTextureId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
//glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
//glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
if(!theTextureId)
{
std::cout<<"texture NOT loaded successfully: "<<name<<'\n';
}
它的作用是加载纹理,但不是渲染所有像素,而是为孔对象提供图像中第一个像素的颜色。
所以,如果纹理是这个:
它将呈现绿色块。
编辑: 纹理坐标:
dataToSet[0].texCoord.s = texLeft;
dataToSet[0].texCoord.t = texTop;
dataToSet[1].texCoord.s = texLeft;
dataToSet[1].texCoord.t = texBottom;
dataToSet[2].texCoord.s = texRight;
dataToSet[2].texCoord.t = texBottom;
dataToSet[3].texCoord.s = texRight;
dataToSet[3].texCoord.t = texTop;
其中:GLfloat texTop = 1,texBottom = 0,texLeft = 0,texRight = 1; 我也尝试使用纹理宽度和高度而不是0和1,我得到了相同的结果。在Windows上,它使用此纹理坐标正确渲染。