尝试设置无绑定纹理时,无论何时调用glGetTextureHandleARB()
,都会导致OpenGL错误GL_INVALID_OPERATION
。这个页面说这是因为我指定的纹理对象不完整。在花了(太多(时间试图弄清楚这里的纹理完整性(并尝试使用glTexParameters()
告诉OpenGL我没有mipmaps(之后,我在调用之前没有发现我做错了什么,希望能得到一些帮助。
纹理。c:
#include "texture.h"
#include <glad/glad.h>
#define STB_IMAGE_IMPLEMENTATION
#include <stb/stb_image.h>
struct Texture texture_create_bindless_texture(const char *path) {
struct Texture texture;
int components;
void *data = stbi_load(path, &texture.width, &texture.height, &components,
4);
glGenTextures(1, &texture.id);
glBindTexture(GL_TEXTURE_2D, texture.id);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture.width, texture.height,
0, GL_RGBA, GL_UNSIGNED_BYTE, data);
texture.bindless_handle = glGetTextureHandleARB(texture.id);
glMakeTextureHandleResidentARB(texture.bindless_handle);
glBindTexture(GL_TEXTURE_2D, 0);
stbi_image_free(data);
return texture;
}
纹理。h:
#ifndef TEXTURE_INCLUDED
#define TEXTURE_INCLUDED
#include <glad/glad.h>
struct Texture {
int width;
int height;
GLuint id;
GLuint64 bindless_handle;
};
struct Texture texture_create_bindless_texture(const char *path);
#endif
我不认为这是一个完整性问题;尝试添加此代码:
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToBorderArb);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToBorderArb);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureBorderColor, new float[4]);
(这是从我的C#项目中复制的,但应该是ez来翻译(
这可能会起作用,因为根据文档,无装订纹理必须具有以下4种边界颜色中的任意一种:(0,0,0,0(、(0,0,0,1(、"(1,1,1,0("或"(1,11,1,1,1("。(我很想链接特定的段落,但我做不到,所以只需ctrl+f并搜索(0,0,0,0(即可找到相关段落(
我错误地给了stbi_load()
一个不存在的路径,并且忽略了添加一个检查返回的指针是否是NULL
(或者路径是否存在(。我想OpenGL在某个地方不喜欢这样,但只是在我尝试调用glGetTextureHandleARB()
时才告诉我这件事。至少现在我学会了检查别人递给我的东西:(