glfw 相关问题

GLFW是一个免费的开源多平台库,用于打开窗口,创建OpenGL上下文和管理输入。它很容易集成到现有的应用程序中,并没有声称主循环。 GLFW是用C语言编写的,并且对Windows,Mac OS X以及使用X Window系统的许多类Unix系统(例如Linux和FreeBSD)提供原生支持。 GLFW根据zlib / libpng许可证授权。

OpenGL着色器错误C7548:错误C0000:...或#version 410 [关闭]

我不知道我的代码或配置有什么问题。我仔细检查了代码和 VS 设置,为我的 GPU 安装了最新的驱动程序,但仍然看到此错误。错误 C0000:... 或 #version 410 和错误

回答 0 投票 0

这个错误有解决办法吗? GLFW C++

我在 Ubuntu 20.04 LTS 系统上,我无法运行我的 CPP 代码。每次我尝试编译这个: #包括 #包括 #include "glad/glad.h" 在...

回答 1 投票 0

glGenVertexArrays(1, &ID) 仅在使用 openGL 3.3 和核心配置文件时导致段错误

我目前在这里使用 OpenGL 教程。函数 glGenVertexArrays(1, &ID);根据 VSCode 调试器的段错误,我认为函数本身是一个问题,因为只使用

回答 0 投票 0

连接 GLFW 与 Cmake 失败

我整个下午都在尝试将 GLFW 与 cmake 链接起来,但似乎没有任何效果。这是我当前的 cmake 文件 cmake_minimum_required(版本 3.22.2) 设置(CMAKE_CXX_STANDARD 23) 项目(

回答 0 投票 0

GLFW 错误#65544“无法初始化 GLFW”

这是我的代码: #包括 #包括 诠释主要(无效){ GLFWwindow* 窗口; 如果(!glfwInit()){ 标准::计算<< "Failed to initialize GLFW!&q...

回答 1 投票 0

绑定 2 个不同的纹理单元,但只有一个会在 opengl 中渲染 [重复]

有这个简单的代码: #包括 #包括 #包括 #define STB_IMAGE_IMPLEMENTATION #包括 #包括 有这个简单的代码: #include <iostream> #include <glad/glad.h> #include <GLFW/glfw3.h> #define STB_IMAGE_IMPLEMENTATION #include <stb/stb_image.h> #include <test/main/shader.hpp> uint32_t LoadTexture(const std::string& filepath) { int w, h, bits; stbi_set_flip_vertically_on_load(1); uint8_t *pixels = stbi_load(filepath.c_str(), &w, &h, &bits, 4); uint32_t texture_id; glGenTextures(1, &texture_id); glBindTexture(GL_TEXTURE_2D, texture_id); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); stbi_image_free(pixels); return texture_id; } // https://stackoverflow.com/questions/60513272/alternative-for-glbindtextureunit-for-opengl-versions-less-than-4-5 void Bind2DTexture(int unit, uint32_t texture) { glActiveTexture(GL_TEXTURE0 + unit); glBindTexture(GL_TEXTURE_2D, texture); } int main() { glfwInit(); GLFWwindow *window = glfwCreateWindow(960, 540, "test", nullptr, nullptr); if (window == nullptr) { std::cerr << "failed to create GLFW window\n"; } glfwMakeContextCurrent(window); glfwSetFramebufferSizeCallback(window, [](GLFWwindow *_, int width, int height) { glViewport(0, 0, width, height); }); if (!gladLoadGLLoader((GLADloadproc) glfwGetProcAddress)) { std::cerr << "failed to initialize GLAD\n"; } glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); Shader shader("assets/GLSL/test.glsl"); shader.Bind(); int samplers[2] = {0, 1}; shader.SetIntArray("u_textures", samplers, 2); uint32_t quad_va, quad_vb, quad_ib; glGenVertexArrays(1, &quad_va); glBindVertexArray(quad_va); float vertices[] = { // first texture - logo.png -1.5f, -0.5f, 0.0f, 0.0f, 0.0f, 0.0f, -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, -0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, -1.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // second texture - chessboard.png 0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 1.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.5f, 0.5f, 0.0f, 1.0f, 1.0f, 1.0f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f }; glGenBuffers(1, &quad_vb); glBindBuffer(GL_ARRAY_BUFFER, quad_vb); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, nullptr); glEnableVertexAttribArray(0); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 6, reinterpret_cast<const void *>(sizeof(float) * 3)); glEnableVertexAttribArray(1); glVertexAttribPointer(2, 1, GL_FLOAT, GL_FALSE, sizeof(float) * 6, reinterpret_cast<const void *>(sizeof(float) * 5)); glEnableVertexAttribArray(2); uint32_t indices[] = { 0, 1, 2, 2, 3, 0, 4, 5, 6, 6, 7, 4 }; glGenBuffers(1, &quad_ib); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, quad_ib); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); uint32_t logo_id = LoadTexture("assets/textures/logo.png"); uint32_t chessboard_id = LoadTexture("assets/textures/chessboard.png"); while (!glfwWindowShouldClose(window)) { glClearColor(0.1f, 0.1f, 0.1f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shader.Bind(); Bind2DTexture(0, logo_id); Bind2DTexture(1, chessboard_id); glBindVertexArray(quad_va); glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_INT, nullptr); glfwSwapBuffers(window); glfwPollEvents(); } } 和着色器: #type vertex #version 450 core layout(location = 0) in vec3 a_pos; layout(location = 1) in vec2 a_texcoord; layout(location = 0) in float a_texindex; out vec2 v_texcoord; out float v_texindex; void main() { v_texcoord = a_texcoord; v_texindex = a_texindex; gl_Position = vec4(a_pos, 1.0); } #type fragment #version 450 core in vec2 v_texcoord; in float v_texindex; uniform sampler2D u_textures[2]; out vec4 color; void main() { int index = int(v_texcoord); color = texture(u_textures[index], v_texcoord); } 未显示的 Shader 类简单地解析包含顶点和片段部分的着色器文件。现在两个纹理通过最后一个属性指针来区分,一个浮点数 0.0f 用于第一个纹理,1.0f 用于第二个纹理(并转换为 int 以用作着色器内的索引)。但是在输出中,只有第一个,即 logo.png(因为它是通过 Bind2DTexture(0, logo_id); 设置的)将被绘制,而 chessboard.png 不会被绘制。但是两个纹理都是通过 Bind2DTexture 设置为单位的。那么为什么chessborad.png 不是画出来的吗? PS:为了完整起见,这里是着色器类: 标题: #ifndef TEST_SHADER_HPP #define TEST_SHADER_HPP #include <string> #include <glm/glm.hpp> class Shader { public: explicit Shader(const std::string& filepath); void Bind() const; void SetInt(const std::string& name, int value) const; void SetIntArray(const std::string& name, int *values, int count); void SetFloat(const std::string& name, float value) const; void SetVec3(const std::string& name, const glm::vec3& vec) const; void SetVec4(const std::string& name, const glm::vec4& vec) const; void SetMat4(const std::string& name, const glm::mat4& mat) const; private: static void CheckCompileErrors(uint32_t shader_id, const std::string& type, const std::string& filepath); uint32_t id_; }; #endif //TEST_SHADER_HP 来源: #include <test/main/shader.hpp> #include <iostream> #include <fstream> #include <sstream> #include <glad/glad.h> void Shader::CheckCompileErrors(uint32_t shader_id, const std::string& type, const std::string& filepath) { int success; char infoLog[1024]; if (type != "PROGRAM") { glGetShaderiv(shader_id, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(shader_id, 1024, nullptr, infoLog); std::cout << "ERROR::SHADER::COMPILATION_ERROR of type: " << type << "\n" << infoLog << "filepath: " << filepath; } } else { glGetProgramiv(shader_id, GL_LINK_STATUS, &success); if (!success) { glGetProgramInfoLog(shader_id, 1024, nullptr, infoLog); std::cout << "ERROR::PROGRAM_LINKING_ERROR of type: " << type << "\n" << infoLog << "filepath: " << filepath; } } } Shader::Shader(const std::string& filepath) { // 1. divide vertex and fragment part enum class ShaderType { NONE = -1, VERTEX = 0, FRAGMENT = 1 }; std::ifstream stream(filepath); std::string line; std::stringstream ss[2]; ShaderType type = ShaderType::NONE; while (getline(stream, line)) { if (line.find("#type") != std::string::npos) { if (line.find("vertex") != std::string::npos) { type = ShaderType::VERTEX; } else if (line.find("fragment") != std::string::npos) { type = ShaderType::FRAGMENT; } else { std::cout << "Unknown shader: " << line << '\n'; } } else { if (type == ShaderType::NONE) { std::cout << "No shader defined" << '\n'; } else { ss[(int) type] << line << '\n'; } } } std::string vertex_code = ss[(int) ShaderType::VERTEX].str(); std::string fragment_code = ss[(int) ShaderType::FRAGMENT].str(); // 2. convert, compile and link sources to shader program // 2.1 convert string to c str const char *vertex_str = vertex_code.c_str(); const char *fragment_str = fragment_code.c_str(); // 2.2.1 vertex shader uint32_t vertex_id = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertex_id, 1, &vertex_str, nullptr); glCompileShader(vertex_id); CheckCompileErrors(vertex_id, "VERTEX", filepath); // 2.2.2 fragment shader uint32_t fragment_id = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragment_id, 1, &fragment_str, nullptr); glCompileShader(fragment_id); CheckCompileErrors(fragment_id, "FRAGMENT", filepath); // 2.3 shader program id_ = glCreateProgram(); glAttachShader(id_, vertex_id); glAttachShader(id_, fragment_id); glLinkProgram(id_); CheckCompileErrors(id_, "PROGRAM", filepath); // 2.4 delete the shaders as they're linked into program and no longer necessary glDeleteShader(vertex_id); glDeleteShader(fragment_id); } void Shader::Bind() const { glUseProgram(id_); } void Shader::SetInt(const std::string& name, int value) const { glUniform1i(glGetUniformLocation(id_, name.c_str()), value); } void Shader::SetIntArray(const std::string& name, int *values, int count) { glUniform1iv(glGetUniformLocation(id_, name.c_str()), count, values); } void Shader::SetFloat(const std::string& name, float value) const { glUniform1f(glGetUniformLocation(id_, name.c_str()), value); } void Shader::SetVec4(const std::string& name, const glm::vec4& vec) const { glUniform4f(glGetUniformLocation(id_, name.c_str()), vec.x, vec.y, vec.z, vec.w); } void Shader::SetVec3(const std::string& name, const glm::vec3& vec) const { glUniform3f(glGetUniformLocation(id_, name.c_str()), vec.x, vec.y, vec.z); } void Shader::SetMat4(const std::string& name, const glm::mat4& mat) const { glUniformMatrix4fv(glGetUniformLocation(id_, name.c_str()), 1, GL_FALSE, &mat[0][0]); }

回答 0 投票 0

glDrawElements 什么都不做。 Opengl

有这个简单的代码: #包括 #包括 #包括 #包括 #包括 #包括 有这个简单的代码: #include <iostream> #include <memory> #include <glad/glad.h> #include <GLFW/glfw3.h> #include <glm/glm.hpp> #include <test/main/shader.hpp> class Foo { public: void OnAttach() { glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); window_ = glfwCreateWindow(960, 540, "test", nullptr, nullptr); if (window_ == nullptr) { std::cerr << "failed to create GLFW window\n"; } glfwMakeContextCurrent(window_); glfwSetFramebufferSizeCallback(window_, [](GLFWwindow *_, int width, int height) { glViewport(0, 0, width, height); }); if (!gladLoadGLLoader((GLADloadproc) glfwGetProcAddress)) { std::cerr << "failed to initialize GLAD\n"; } glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); shader_ = std::make_shared<Shader>("assets/GLSL/test.glsl"); glGenVertexArrays(1, &quad_va_); glBindVertexArray(quad_va_); float vertices[] = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.5f, 0.5f, 0.0f, -0.5f, 0.5f, 0.0f }; glGenBuffers(1, &quad_vb_); glBindBuffer(GL_ARRAY_BUFFER, quad_vb_); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, nullptr); glEnableVertexAttribArray(0); uint32_t indices[] = {0, 1, 2, 2, 3, 0}; glGenBuffers(1, &quad_ib_); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, quad_ib_); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); } void OnUpdate() { glClearColor(0.1f, 0.1f, 0.1f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shader_->Bind(); shader_->SetVec3("u_color", square_color_); glBindVertexArray(quad_va_); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr); } GLFWwindow *GetWindow() const { return window_; } private: GLFWwindow *window_; std::shared_ptr<Shader> shader_; uint32_t quad_va_, quad_vb_, quad_ib_; glm::vec4 square_color_ = {0.8f, 0.2f, 0.3f, 1.0f}; }; void Run(Foo *foo) { foo->OnAttach(); while (!glfwWindowShouldClose(foo->GetWindow())) { foo->OnUpdate(); glfwSwapBuffers(foo->GetWindow()); glfwPollEvents(); } } int main() { Run(new Foo); } 和着色器: #type vertex #version 330 core layout(location = 0) in vec3 a_pos; uniform mat4 u_view_projection; void main() { gl_Position = vec4(a_pos, 1.0); } #type fragment #version 330 core out vec4 color; uniform vec4 u_color; void main() { color = u_color; } 未显示的 Shader 类简单地解析包含顶点和片段部分的着色器文件。并在帧循环中简单地设置制服。我只看到空窗口,没有正方形。但一切似乎都已注定。出了什么问题? PS:为了完整起见,这里是着色器类: 标题: #ifndef TEST_SHADER_HPP #define TEST_SHADER_HPP #include <string> #include <glm/glm.hpp> class Shader { public: explicit Shader(const std::string& filepath); void Bind() const; void SetInt(const std::string& name, int value) const; void SetFloat(const std::string& name, float value) const; void SetVec3(const std::string& name, const glm::vec3& vec) const; void SetVec4(const std::string& name, const glm::vec4& vec) const; void SetMat4(const std::string& name, const glm::mat4& mat) const; private: static void CheckCompileErrors(uint32_t shader_id, const std::string& type, const std::string& filepath); uint32_t id_; }; #endif //TEST_SHADER_HP 来源: #include <test/main/shader.hpp> #include <iostream> #include <fstream> #include <sstream> #include <glad/glad.h> void Shader::CheckCompileErrors(uint32_t shader_id, const std::string& type, const std::string& filepath) { int success; char infoLog[1024]; if (type != "PROGRAM") { glGetShaderiv(shader_id, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(shader_id, 1024, nullptr, infoLog); std::cout << "ERROR::SHADER::COMPILATION_ERROR of type: " << type << "\n" << infoLog << "filepath: " << filepath; } } else { glGetProgramiv(shader_id, GL_LINK_STATUS, &success); if (!success) { glGetProgramInfoLog(shader_id, 1024, nullptr, infoLog); std::cout << "ERROR::PROGRAM_LINKING_ERROR of type: " << type << "\n" << infoLog << "filepath: " << filepath; } } } Shader::Shader(const std::string& filepath) { // 1. divide vertex and fragment part enum class ShaderType { NONE = -1, VERTEX = 0, FRAGMENT = 1 }; std::ifstream stream(filepath); std::string line; std::stringstream ss[2]; ShaderType type = ShaderType::NONE; while (getline(stream, line)) { if (line.find("#type") != std::string::npos) { if (line.find("vertex") != std::string::npos) { type = ShaderType::VERTEX; } else if (line.find("fragment") != std::string::npos) { type = ShaderType::FRAGMENT; } else { std::cout << "Unknown shader: " << line << '\n'; } } else { if (type == ShaderType::NONE) { std::cout << "No shader defined" << '\n'; } else { ss[(int) type] << line << '\n'; } } } std::string vertex_code = ss[(int) ShaderType::VERTEX].str(); std::string fragment_code = ss[(int) ShaderType::FRAGMENT].str(); // 2. convert, compile and link sources to shader program // 2.1 convert string to c str const char *vertex_str = vertex_code.c_str(); const char *fragment_str = fragment_code.c_str(); // 2.2.1 vertex shader uint32_t vertex_id = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertex_id, 1, &vertex_str, nullptr); glCompileShader(vertex_id); CheckCompileErrors(vertex_id, "VERTEX", filepath); // 2.2.2 fragment shader uint32_t fragment_id = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragment_id, 1, &fragment_str, nullptr); glCompileShader(fragment_id); CheckCompileErrors(fragment_id, "FRAGMENT", filepath); // 2.3 shader program id_ = glCreateProgram(); glAttachShader(id_, vertex_id); glAttachShader(id_, fragment_id); glLinkProgram(id_); CheckCompileErrors(id_, "PROGRAM", filepath); // 2.4 delete the shaders as they're linked into program and no longer necessary glDeleteShader(vertex_id); glDeleteShader(fragment_id); } void Shader::Bind() const { glUseProgram(id_); } void Shader::SetInt(const std::string& name, int value) const { glUniform1i(glGetUniformLocation(id_, name.c_str()), value); } void Shader::SetFloat(const std::string& name, float value) const { glUniform1f(glGetUniformLocation(id_, name.c_str()), value); } void Shader::SetVec4(const std::string& name, const glm::vec4& vec) const { glUniform4f(glGetUniformLocation(id_, name.c_str()), vec.x, vec.y, vec.z, vec.w); } void Shader::SetVec3(const std::string& name, const glm::vec3& vec) const { glUniform3f(glGetUniformLocation(id_, name.c_str()), vec.x, vec.y, vec.z); } void Shader::SetMat4(const std::string& name, const glm::mat4& mat) const { glUniformMatrix4fv(glGetUniformLocation(id_, name.c_str()), 1, GL_FALSE, &mat[0][0]); }

回答 0 投票 0

使用非静态成员函数为 glfw 设置回调函数

我正在使用 glfw 来设置 OpenGL 可视化。我想将回调函数设置为非静态函数来访问类变量。但是,当我执行以下操作时,出现错误“

回答 1 投票 0

OpenGL同时渲染3d模型和yuv420p视频

这里是: 技术栈:glfw、opengl、ubuntu 我的目标是同时渲染两个东西,一个 3d 模型和一个 yuv420p 视频(使用两个不同的着色器程序)。 如果我只渲染其中之一...

回答 0 投票 0

imgui 在 GLFW + OpenGL3 上不显示

初始化GLFW窗口 m_Window = glfwCreateWindow((int)m_Data.Width, (int)m_Data.Height, m_Data.Title.c_str(), nullptr, nullptr); glfwMakeContextCurrent(m_Window); int status = gladLoadGLLoader((

回答 0 投票 0

CUDA OpenGL 互操作性错误:cudaGraphicsResourceGetMappedPointer 资源未映射为指针

我正在尝试编写一些代码,在使用 CUDA 计算的 OpenGL 窗口中显示一个数组。我试图将创建一个简单示例程序所必需的东西复制在一起……

回答 0 投票 0

调用 glDisableVertexAttribArray(0) 时应用程序崩溃 [关闭]

运行应用程序时崩溃, 特别是当我调用 glDisableVertexAttribArray(0) 时。但这里有一个问题,我正在制作一个游戏引擎,虽然我知道如何处理 OOP,但这个问题会......

回答 0 投票 0

C++ 中 OpenGL 顶点着色器的语法错误? [关闭]

这是我的顶点着色器来源: #version 330核心 vec3 aPos 中的布局(位置=0); vec4 aColor 中的布局(位置=1); 输出 vec4 fColor; 无效主要(){ fColor = aColor; gl_Position = vec...

回答 0 投票 0

我的顶点和片段着色器是我在 glfw 中出现黑屏的原因吗? [关闭]

我正在用 C++ 编写一个光线行进程序,但我似乎无法让屏幕显示要绘制到屏幕上的结果。我制作了一个正方形并将其作为纹理放在正方形上。我相信...

回答 0 投票 0

glfw-0.51:无法在 MacOS Ventura 13.2.1 上创建窗口

我正在使用以下代码创建一个窗口 // 设置 GLFW 平台 让 mut glfw = glfw::init(glfw::FAIL_ON_ERRORS).unwrap(); glfw.window_hint(glfw::WindowHint::

回答 0 投票 0

OpenGL MSYS2 链接器

我通过 MSYS2 安装了 glew、glfw 和 glm 库。我正在尝试使用链接器对其进行编译,但出现以下错误: g++ main.cpp -o main -g -lglfw -lpthread -lX11 -ldl -lXrandr -lGLEW -lGL -

回答 0 投票 0

OpenGL GLFW:对“glfwInit”的未定义引用

我只是想让 OpenGL 使用 GLFW 在我的机器(Windows 7 64 位)上工作。 我收到单一链接器错误: 未定义对“glfwInit”的引用。 我要编译的代码是

回答 5 投票 0

MacOS 运行时错误:验证失败:没有 VAO 绑定

我需要有关在 MacOS 上的 CLion 中设置 OpenGL 项目的帮助。该项目还使用了 glad 和 GLFW。最重要的是,我在项目中包含了一些头文件和源文件

回答 1 投票 0

使用 open3d 绘制几何图形时 X DISPLAY 出现问题

我收到以下错误: [1;33m[Open3D 警告] GLFW 错误:X11:无法打开显示:0.0[0;m [1;33m[Open3D 警告] 无法初始化 GLFW[0;m [1;33m[Open3D 警告] [DrawGeometries] 失败

回答 2 投票 0

哪个线程会调用 GLFW 回调?

我发现这些函数可以为来自硬件的事件注册回调(也许?我不确定)。 喜欢以下功能。 glfwSetCursorPosCallback(窗口,鼠标回调); glfwSetScrollCallback(窗口,

回答 2 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.