glsl 相关问题

OpenGL着色语言(GLSL)是OpenGL中着色器的标准编程语言。该语言有许多版本,每个版本对应一个OpenGL版本。 OpenGL ES 2.0及更高版本具有单独的GLSL版本。

为什么我的 OpenGL SSB 没有接收到主机发送的数据?

我将尝试创建尽可能多的 MRE,但让 OpenGL 在 Rust 中工作相当复杂,所以我将跳过样板文件和一些不必要的细节。 我正在尝试创建一个

回答 0 投票 0

Win32 现代 OpenGL 着色器根本无法渲染任何东西 [关闭]

我正在使用 win32 编写一个基本的 opengl 抽象库,我一直坚持获取 2d 纹理以渲染为两个三角形四边形。我得到的不是渲染四边形,而是一个空白的黑屏。

回答 0 投票 0

在 div 的范围内绘制

我将像素坐标连同 div 的大小作为制服传递给着色器: const targetElement = document.querySelector(".targetElement"); const targetElementW = targetElem...

回答 0 投票 0

如何使用 GL_TEXTURE_2D_ARRAY 绑定多个纹理(作为数组)?

根据这个答案:OpenGL sampler2D array 您不能使用片段着色器输入变量来索引纹理采样器数组。你必须使用 sampler2DArray (GL_TEXTURE_2D_ARRAY) inste ...

回答 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

glBindBuffer 中的 GL_ARRAY_BUFFER 目标是什么意思?

我对 VBO 感到困惑, glGenBuffers(1, &positionBufferObject); glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject); 除了 GL_ARRAY_BUFFER,还有其他目标类型:

回答 3 投票 0

渲染到纹理和从同一纹理读取不能正常工作

我创建了一个存储纹理并存储了显示在屏幕上的相同片段。但是当我从另一个管道的片段着色器中读取相同的纹理时,它似乎不起作用

回答 0 投票 0

如何使用顶点着色器根据高度为陡峭的平面着色?

我使用 Mesh、PlaneGeometry 和 ShaderMaterial 在三个 js 中制作了一个平面。这是一个非常简单/基本的形式。我应用了一个简单的 phormula 来使平原更加陡峭。现在我正在尝试使地形成为...

回答 1 投票 0

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

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

回答 0 投票 0

为什么我的着色器适用于 BoxGeometry 而不是我在 ThreeJs 中的自定义 BufferGeometry?

我有一个问题,我有一个着色器在网格的几何边缘周围绘制白色边框(从@prisoner849 借用和修改,在这里参考他的 jsfiddle (https://jsfiddle.net/

回答 0 投票 0

带有 GLSL 的 OpenGL 4.5 中的无限网格问题

我一直在玩弄无限网格,使用 OpenGL 4.5 中的着色器,遵循这里的教程。由于本教程是为 Vulkan 和更高版本的 GLSL(我使用的是 450 核)编写的,...

回答 2 投票 0

我应该在哪里设置着色器代码中对应于“VkVertexInputBindingDescription.binding”在C++代码中设置的输入顶点绑定号?

我正在学习vulkan。我尝试在顶点着色器中设置输入顶点的绑定数,如统一缓冲区。 //c++ 使用 vulkan.hpp vk::VertexInputBindingDescription 绑定; 绑定.setBinding(0) ...

回答 1 投票 0

Android Vulkan ClipDistance 在 Pixel6 和 7 上崩溃

使用带有 ClipDistance 的顶点着色器创建 Vulkan 管道时,我在 Android(Pixel6 和 7)上发生崩溃。这发生在一个空项目上。 下面是崩溃信息转储示例。 原因:空

回答 0 投票 0

如何在 OpenGL 着色器中实现 OpenCV 鱼眼相机模型以消除图像失真

我正在尝试在 OpenGL 着色器中实现 OpenCV 鱼眼相机模型以提高渲染速度,我正在关注 OpenCV 的文档。但是我得到的结果仍然有些失真。 这是...

回答 0 投票 0

Opengl 纹理函数有时会破坏着色器

我正在使用 OpenGl 和 Rust 在一个小迷宫应用程序中实现点照明。我让一切正常,直到我想要阴影。我生成一个空的立方体贴图并将其附加到一个框架...

回答 1 投票 0

OpenGL 和 GLSL 几何着色器只渲染一个点而不是三角形

我正在尝试渲染一个正方形,但它只渲染一个点,我不确定为什么。我知道发送到 gpu 的数据是有效的,这是正在发送的数据 结构 gpuData{...

回答 0 投票 0

glLinkProgram 中的分段错误

我正在使用 SDL2 和 GLES3 编写一个简单的 GUI 工具包。我的司机是新手。代码运行良好,直到我尝试编译着色器程序,这导致在执行

回答 1 投票 0

根据相机渲染纹理中的属性丢弃 2D 游戏对象的像素?

我有一个 c# 脚本和一个着色器脚本,它们应该创建两个游戏对象并根据像素的 b 值是否如相机

回答 0 投票 0

为什么深度偏移量可以大于一个?

在 glPolygonOffset(factor, units) 函数中偏移值是这样计算的: o = m * 因子 + r * 单位 如果输入因子或单位太大,则结果 o 可能大于 1。

回答 0 投票 0

解释一下 OpenGL 如何在 SSBO 中存储变量

我在 SSBO 中遇到了一个关于变量的奇怪问题。 我有以下结构,其中包含传递给 SSBO 的变量: 结构{ glm::mat4 modelViewMatrix{1}; ViewRenderTypeEnum 类型...

回答 2 投票 0

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