我正在尝试将我的游戏引擎从 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 上,它使用此纹理坐标正确渲染。