glsl 相关问题

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

使用 OpenGl 渲染 .obj 文件

我想用c++加载.obj文件并用OpenGl将其形状和材质绘制到场景中。为了进行加载,我使用 syoyo 的tinyobjectloader。加载效果非常好,我能够...

回答 1 投票 0

如何在粒子碰撞的计算着色器中同步内存

我在计算着色器中有一个可用的粒子碰撞系统,我尝试使用空间哈希和共享内存对其进行优化。 空间哈希与缓冲区一起工作,但是当我运行它时我......

回答 1 投票 0

更新 GLSL 代码后,vite 不更新页面

这几天我一直在尝试学习GLSL,但有一点限制了我的进步,那就是当GLSL代码更新时页面不会更新,而我需要手动更新...

回答 1 投票 0

如何使用 PySide 6 在 Qt3d 中创建统一对象缓冲区?

我正在使用 Qt3d(不是 QML)使用 PySide6 编写 3d 游戏关卡编辑器。我偶然发现了一个问题 - 我不知道如何使用 Qt3d 创建统一缓冲区对象。基本上我想传递......的列表

回答 1 投票 0

有人知道WebGPU或WebGL中的标准Mipmap lod逻辑吗?

在 wgsl 中,平铺 mipmap 纹理会在边缘产生难看的伪影。这可能是因为推导在边缘失败。采样器根据 th 的梯度对 mipmap 进行加权...

回答 1 投票 0

如何访问 GLSL 片段着色器纹理中的自动 mipmap 级别?

如何确定在 GLSL 片段着色器中采样纹理时使用的 mipmap 级别? 我知道我可以使用textureLod 手动采样纹理的特定mipmap 级别...

回答 2 投票 0

线性采样高斯模糊质量问题

我最近根据这篇文章实现了线性采样高斯模糊:Linear Sampled Gaussian Blur 总体效果不错,但文本和细线似乎有轻微锯齿

回答 3 投票 0

为什么GLSL着色器程序无法正确链接?

由于未知原因,GLSL 着色器程序无法正确链接,日志为空。着色器编译正确。 尝试做: CompileShaders("数据/着色器/ui", 0b01, MainUiShader); ...给出一个呃...

回答 1 投票 0

顶点着色器和实例化,保留为一个实例的每个顶点计算的一些数据

我正在使用 GLSL 和 Vulkan。有没有一种方法可以使从顶点着色器计算出的数据对于一个实例的所有下一个顶点保持“统一”? 我必须在

回答 1 投票 0

GLSL 着色器顶点位移仅在 1 个顶点上

我正在尝试重构十年前的 GLSL 顶点位移着色器,该着色器曾经与 Three.js 的旧版本一起使用,但我遇到了一系列来自纹理操作顺序的问题...

回答 1 投票 0

为什么glsl着色器程序无法正确链接(空日志)

由于未知原因,openGL GLSL 着色器程序无法正确链接,日志为空。着色器编译正确。 尝试做: CompileShaders("数据/Shaders/ui", 0b01, MainUiShader); 给出...

回答 1 投票 0

OpenGL程序只显示黑屏,而它应该显示一个正方形(我使用的是fedora linux)

我正在使用 fedora Linux 进行 openGL 开发。 仅显示一个黑色窗口,没有形状或任何东西。 我认为这是操作系统或设备问题,但不知道如何解决。 我正在使用 Fedora li...

回答 1 投票 0

使用 ThreeJS 从片段着色器读取生成的纹理时出现问题

我正在尝试使用 Three.WebGLRenderTarget 生成纹理,然后在下一阶段的片段着色器中访问它。 这个想法是运行第一阶段一次以生成复杂且昂贵的......

回答 1 投票 0

Visual Studio 调试器对于调试我的 OpenGL 代码有用吗?

是否可以使用 Visual Studio 调试器来调试我的 GLFW/OpenGL 代码?我在 glDrawElements() 调用上遇到异常,它提供了无用的信息。显然我没有正确设置...

回答 1 投票 0

自定义 OpenGL 引擎 PBR 结果不符合预期

我已经遵循了 PBR 的 LearnOpenGL 教程并获得了附加的输出,虽然看起来不错,但我注意到我在 sketchfab 或 UE5 中看到的结果更加真实,因此我试图了解...

回答 1 投票 0

OpenGL中计算两幅图像差异时如何正确处理负值?

我正在做一个使用OpenGL的项目,其中服务器需要渲染两个图像:一个高质量图像和一个低质量图像。目标是计算两者之间的差异图像并发送

回答 2 投票 0

OpenGL程序无法绘制三角形?

我将 OpenGL 与 GLEW 和 GLFW 一起使用。我创建了两个着色器,它们编译得很好: #包括 #包括 #包括 #包括 我将 OpenGL 与 GLEW 和 GLFW 一起使用。我创建了两个着色器,它们编译得很好: #include <iostream> #include <GL/glew.h> #include <OpenGL/OpenGL.h> #include <GLFW/glfw3.h> static unsigned int CompileShader( unsigned int type, const std::string source){ unsigned int id = glCreateShader(type); const char* src = source.c_str(); glShaderSource(id, 1, &src, nullptr); glCompileShader(id); int result; glGetShaderiv(id, GL_COMPILE_STATUS, &result); if (result == GL_FALSE){ int length; glGetShaderiv(id, GL_INFO_LOG_LENGTH, &length); char* message = (char*)alloca(length * sizeof(char)); glGetShaderInfoLog(id, length, &length, message); std::cout <<"failed to compile " << (type == GL_VERTEX_SHADER ? "vertex" : "fragment") << " shader" <<"\n"; std::cout << message << "\n"; glDeleteShader(id); return 0; } return id; } static int CreateShader(const std::string& VertexShader, const std::string& FragmentShader){ unsigned int program = glCreateProgram(); unsigned int vs = CompileShader(GL_VERTEX_SHADER, VertexShader); unsigned int fs = CompileShader(GL_FRAGMENT_SHADER, FragmentShader); glAttachShader(program, vs); glAttachShader(program, fs); glLinkProgram(program); glValidateProgram(program); glDeleteShader(vs); glDeleteShader(fs); return program; } int main(void){ /* Initialize the library */ GLFWwindow* window; if (!glfwInit()){return -1;} glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); #ifdef __APPLE__ glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); #endif /* Create a windowed mode window and its OpenGL context */ window = glfwCreateWindow(640, 480, "Gaston", NULL, NULL); if (!window){ glfwTerminate(); return -1; } /* Make the window's context current */ glfwMakeContextCurrent(window); if (glewInit() != GLEW_OK){ std::cout <<"glewunit(); failed\n"; } float positions[6] = { -0.5f, -0.5f, -.9f, .5f, 0.5f, 0.5f }; unsigned int buffer; glGenBuffers(1, &buffer); glBindBuffer(GL_ARRAY_BUFFER, buffer); glBufferData(GL_ARRAY_BUFFER, sizeof(positions) * sizeof(float), positions, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float)*2, 0); glBindBuffer(GL_ARRAY_BUFFER, 0); std::string vertexshader = "#version 330 core\n" "\n" "layout(location = 0) in vec4 position;\n" "\n" "void main()\n" "{\n" " gl_Position = position;\n" "}\n"; std::string fragmentshader = "#version 330 core\n" "\n" "layout(location = 0) out vec4 colour;\n" "\n" "void main()\n" "{\n" " colour = vec4(1.0, 0.0, 0.0, 1.0);\n" "}\n"; unsigned int shader = CreateShader(vertexshader, fragmentshader); glUseProgram(shader); /* Loop until the user closes the window */ while (!glfwWindowShouldClose(window)){ /* Render here */ glClear(GL_COLOR_BUFFER_BIT); glDrawArrays(GL_TRIANGLES, 0, 3); /* Swap front and back buffers */ glfwSwapBuffers(window); /* Poll for and process events */ glfwPollEvents(); } glfwTerminate(); return 0; } ...但是三角形没有出现。我得到的只是一个空白屏幕。 理想的结果是红色三角形。 一些事情: 作为@G.M.指出您需要绑定和填充顶点数组对象(VAO)(使用 VBO 绑定和顶点属性启用)才能在 Core 上下文中渲染事物。 例如: GLuint vao = 0; glCreateVertexArrays(1, &vao); glBindVertexArray(vao); 着色器链接也可能失败,请务必通过 glGetProgramiv() & co. 检查这一点 调试上下文和调试消息回调将显示 glDrawArrays() 调用抛出 GL_INVALID_OPERATION: if( glewIsSupported( "GL_ARB_debug_output" ) ) { glEnable( GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB ); glDebugMessageControlARB( GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_TRUE ); glDebugMessageCallbackARB( []( GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar* message, const void* ) { std::cerr << "GL: " << message << std::endl; }, 0 ); } 输出: GL: GL_INVALID_OPERATION in glDrawArrays 大家一起: // g++ main.cpp $(pkg-config --cflags --libs glew glfw3) #include <GL/glew.h> #include <GLFW/glfw3.h> #include <iostream> void CheckStatus( GLuint obj, bool isShader ) { GLint status = GL_FALSE, log[ 1 << 11 ] = { 0 }; ( isShader ? glGetShaderiv : glGetProgramiv )( obj, isShader ? GL_COMPILE_STATUS : GL_LINK_STATUS, &status ); if( status == GL_TRUE ) return; ( isShader ? glGetShaderInfoLog : glGetProgramInfoLog )( obj, sizeof( log ), NULL, (GLchar*)log ); std::cerr << (GLchar*)log << "\n"; std::exit( EXIT_FAILURE ); } void AttachShader( GLuint program, GLenum type, const char* src ) { GLuint shader = glCreateShader( type ); glShaderSource( shader, 1, &src, NULL ); glCompileShader( shader ); CheckStatus( shader, true ); glAttachShader( program, shader ); glDeleteShader( shader ); } const char* const vert = R"GLSL( #version 330 core layout( location = 0 ) in vec4 position; void main() { gl_Position = position; }; )GLSL"; const char* const frag = R"GLSL( #version 330 core layout(location = 0) out vec4 colour; void main() { colour = vec4( 1.0, 0.0, 0.0, 1.0 ); }; )GLSL"; int main( void ) { /* Initialize the library */ glfwSetErrorCallback( []( int, const char* desc ) { std::cerr << desc << "\n"; std::exit( EXIT_FAILURE ); } ); if( !glfwInit() ) { return -1; } glfwWindowHint( GLFW_CONTEXT_VERSION_MAJOR, 3 ); glfwWindowHint( GLFW_CONTEXT_VERSION_MINOR, 3 ); glfwWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE ); #ifdef __APPLE__ glfwWindowHint( GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE ); #endif glfwWindowHint( GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE ); /* Create a windowed mode window and its OpenGL context */ GLFWwindow* window = glfwCreateWindow( 640, 480, "Gaston", NULL, NULL ); if( !window ) { glfwTerminate(); return -1; } /* Make the window's context current */ glfwMakeContextCurrent( window ); if( glewInit() != GLEW_OK ) { std::cout << "glewunit(); failed\n"; } if( glewIsSupported( "GL_ARB_debug_output" ) ) { glEnable( GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB ); glDebugMessageControlARB( GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_TRUE ); glDebugMessageCallbackARB( []( GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar* message, const void* ) { std::cerr << "GL: " << message << std::endl; }, 0 ); } float positions[ 6 ] = { -0.5f, -0.5f, -.9f, .5f, 0.5f, 0.5f }; GLuint vao = 0; glCreateVertexArrays(1, &vao); glBindVertexArray(vao); unsigned int buffer; glGenBuffers( 1, &buffer ); glBindBuffer( GL_ARRAY_BUFFER, buffer ); glBufferData( GL_ARRAY_BUFFER, sizeof( positions ) * sizeof( float ), positions, GL_STATIC_DRAW ); glEnableVertexAttribArray( 0 ); glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, sizeof( float ) * 2, 0 ); glBindBuffer( GL_ARRAY_BUFFER, 0 ); GLuint prog = glCreateProgram(); AttachShader( prog, GL_VERTEX_SHADER, vert ); AttachShader( prog, GL_FRAGMENT_SHADER, frag ); glLinkProgram( prog ); CheckStatus( prog, false ); glUseProgram( prog ); /* Loop until the user closes the window */ while( !glfwWindowShouldClose( window ) ) { /* Render here */ glClear( GL_COLOR_BUFFER_BIT ); glDrawArrays( GL_TRIANGLES, 0, 3 ); /* Swap front and back buffers */ glfwSwapBuffers( window ); /* Poll for and process events */ glfwPollEvents(); } glfwTerminate(); return 0; }

回答 1 投票 0

如何修复 THREE.js 上的 GLSS 着色,使其显示地球上准确的昼夜周期?

我正在为一个项目开发地球 3D 模型,但遇到了问题。最初,我没有使用任何着色,并将两种材质添加到一个组中,并使用 THREE.AdditiveBlending。这导致了......

回答 1 投票 0

将shadertoy移植到GlslCanvas

我正在尝试遵循shadertoy 中的一些示例。 我正在使用我之前读过的《The Book of Shaders》作者的 GlslCanvas 库,但显然 Shadertoy 使用了一些不同的...

回答 1 投票 0

您可以在 GLSL 着色器中通过引用传递矩阵吗?

如何在 GLSL 着色器中通过引用传递?

回答 2 投票 0

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