为什么我的纹理加载到OpenGL中,未正确映射
Why is my texture loaded into opengl not mapped correctly?
我正在尝试在OpenGL中加载一个简单的模型。目前,我对纹理有问题。质地确实显示出来,但是它弄乱了,也没有涵盖所有模型(模型的一部分是黑色(。我尝试了几件事来确定问题的根源。我以统一的红色纹理传递,并正确地呈现。我将纹理坐标用作片段着色器中的R和G值,并且得到了一个红绿色的模型,因此我认为纹理坐标也很好。
质地弄乱了,部分是黑色的。这只是一个简单的Minecraft字符
模型的纹理,即PNG
这是我创建纹理的方式:
imageData = stbi_load(path.c_str(), &width, &height, &colorFormat, 0);
glGenTextures(1, &texID);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texID);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
我的碎片着色器:
void main(){
vec4 l = normalize(lightSourcePosition - positionEyeCoord);
vec4 normalFrag = normalize(normalEyeCoord);
if (hasTexture == 1){
vec4 textureKD = vec4(texture(textureSampler, texCoord).rgba);
vec4 diffuse = vec4(lightIntensity, 0.0) * textureKD * max(0.0, dot(l, normalFrag));
vec4 ambient = vec4(ambientIntensity, 0.0) * textureKD;
gl_FragColor = ambient + diffuse;
}
else {
vec4 diffuse = vec4(lightIntensity * KD, 0.0) * max(0.0, dot(l, normalFrag));
vec4 ambient = vec4(ambientIntensity * KA, 0.0);
gl_FragColor = ambient + diffuse;
}
}
很可能,您的角色是使用DirectX约定进行纹理建模的。在DirectX中,纹理坐标来源是图像的左上角,而它是OpenGl中的左下角。
您可以做几件事(选择一个(:
- 加载模型时,将所有纹理坐在
(u, v)
中替换CC_1。 - 加载纹理时,垂直翻转图像
- 在您的着色器中,将
vec2(texCoord.x, 1 - texCoord.y)
用于纹理坐标。
我建议不要对快速测试以外的任何其他选项使用第三个选项。
相关文章:
- OpenGL 4.3 错误地将第 4 个纹理坐标映射到与第 3 个纹理坐标相同的位置
- (C++) OpenGL 渲染瓦片映射会导致丢帧
- 为什么我的纹理加载到OpenGL中,未正确映射
- OpenGL 透视投影裁剪多边形与顶点在视锥体之外 = 错误的纹理映射?
- 在 OpenGL 中将深度映射到颜色
- 使用 OpenGL 和 QT 进行纹理映射 - C++
- 使用 openGL 进行多纹理映射
- openGL-testure映射多维数据集失败
- openGL中的Does纹理映射遵循反向方法的正向纹理映射
- OpenGL类型GLint、Glbyte..到C++int32_t,int8_t..映射
- 如何使用 C++/OpenGL 在球体上映射多个图像
- OpenGL:着色器存储缓冲区映射/绑定
- 在 Android NDK 上创建映射/直接 OpenGL ES 纹理
- Android NDK SDL2 OpenGL ES 2 影子映射(定向)- 是否可能
- OpenGL ES上的图像几何重映射
- 在C++中的OpenGL中将坐标从三维透视投影映射到二维正投影
- 在OpenGL中将纹理映射到顶点
- OpenGL 3.3纹理映射三角形
- OpenGL透视投影来映射屏幕像素
- 查找/重新映射OpenGL ES坐标平面的边界