OpenGL纹理在3.3中都是黑色的-但在3.1中工作
OpenGL Textures are all black in 3.3 - but work in 3.1
我目前正在OpenGL3.3中制作一个简单的3D场景,但是当尝试纹理对象时-所有这些对象都是完全黑色的纹理。但是,如果我将上下文版本更改为3.1;在模型上正确渲染纹理是没有问题的。
我不确定这是否表明我使用了已弃用的功能/方法,但我正在努力寻找问题所在。
设置纹理
(load texture from file)
...
glGenTextures(1, &TexID); // Create The Texture ( CHANGE )
glBindTexture(GL_TEXTURE_2D, TexID);
glTexImage2D(GL_TEXTURE_2D, 0, texture_bpp / 8, texture_width, texture_height, 0, texture_type, GL_UNSIGNED_BYTE, texture_imageData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
...
绑定纹理到渲染
// mLocation is the layout location in the shader, from glGetUniformLocation
// mTextureUnit is the specified texture unit to load into. Currently using 0.
// mTextureID is the ID of the loaded texture, as generated above.
glActiveTexture( GL_TEXTURE0 + mData.mTextureUnit );
glBindTexture( GL_TEXTURE_2D, mData.mTextureID );
glUniform1i( mLocation, mData.mTextureUnit );
片段着色器
uniform sampler2D diffusemap;
in vec2 passUV;
out vec3 outColour;
...
outColour = texture( diffusemap, passUV ).rgb;
所有使用的纹理都是2的平方。
显示问题的图片。
GL3.1: https://i.stack.imgur.com/PA4Dp.png
GL3.3: https://i.stack.imgur.com/mhq71.png
顶点着色器
#version 330 core
uniform mat4 p;
uniform mat4 v;
uniform mat4 m;
in vec3 vertex;
in vec3 normal;
in vec2 uv;
out vec3 passVertex;
out vec3 passNormal;
out vec2 passUV;
void main( void )
{
gl_Position = p * v * m * vec4( vertex, 1.0 );
passVertex = vec3( m * vec4( vertex, 1.0 ) );
passNormal = vec3( m * vec4( normal, 1.0 ) );
passUV = uv;
}
行内:
glTexImage2D(GL_TEXTURE_2D, 0, texture_bpp / 8, texture_width, texture_height, 0, texture_type, GL_UNSIGNED_BYTE, texture_imageData);
假设(texture_bpp/8)将返回正确的格式类型是不正确的。它应该是指定内部格式的GLenum值之一,如GL_RGBA。
将其修正为(或任何与纹理文件的内部格式匹配的格式)完全修复了这个问题,并适用于GL3.3和GL3.1:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texture_width, texture_height, 0, texture_type, GL_UNSIGNED_BYTE, texture_imageData);
为了完整起见,纹理的内部格式应该是枚举数。并且是大小的枚举数之一,而不是未大小的枚举数之一。当你可以使用GL_RGB8
时,请停止使用GL_RGB
答案正确地识别了问题,但解释为什么前面的假设在3.1上有效而在3.3上无效会有所帮助。
在[1,4]范围内使用数字的能力在OpenGL 3.0中已弃用,并在OpenGL 3.1中删除。然而,在那个时候,没有办法说,"给我OpenGL 3.1版本的实际核心配置文件";WGL/GLX_CONTEXT_CORE_PROFILE_BIT_ARB
不存在。因此,当您获得3.1上下文时,导出ARB_compatibility
扩展的实现是完全合法的,它仍然允许所有被删除的功能。
在3.2中,OpenGL增加了显式选择配置文件的能力。在这一点上,您不会让某人在核心配置文件中公开ARB_compatibility
。这就是为什么当您要求3.1时代码可以工作(因为它可以免费为您提供3.1兼容性),但当您要求3.3核心配置文件时却不能工作。
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- 编译在我的 Mac 上工作,但在集群 (Linux) 上不起作用
- C++ assigment std::list:<typename>:itrator 在 main 中工作,但在方法中它不起作用
- C++代码在台式机上工作正常,但在笔记本电脑上则不行
- 实现 DFS 在较短的输入下工作正常,但在较大的输入下会抛出分段错误
- 代码在Visual Studio 2017中不起作用,但在VS代码中工作
- 请发现它在 dev 中工作的错误,但在 hackerrank 中不起作用
- OpenCV Tracker 属性访问在 ARM 上因 SEGFAULT 而失败,但在 X86_64 中工作
- 自定义内存管理器在发布模式下工作正常,但在调试模式下则不然
- SIGABRT 和线程相关的异常,但在调试期间工作正常
- ostream_iterator运算符=在pair<int,int>上失败,但在包装器类上工作。我不能为成对<>重载运算符<<吗?
- .exe应用程序在windows10中创建新模块时抛出错误,但在windows7中工作正常
- 为什么这在 c++ 中不起作用,但在 python 中工作
- 我的代码在作为参数传入 .begin() 时不起作用,但在我将 .begin() 转换为迭代器后工作
- PlayFunction在DLL中不起作用,但在独立的exe中工作
- mkdir 从命令行工作,但在使用 NFS 时C++失败
- Makefile在Linux中工作,但在Windows下不起作用,在子目录中找不到文件
- C++代码在 Linux 上按预期工作,但在 Windows 上则不然
- 设备与Visa在Python中工作的通信,但在C 中不进行
- 我的代码在Qt Creator中工作,但在Cloud9中不起作用