OpenGL着色语言(GLSL)是OpenGL中着色器的标准编程语言。该语言有许多版本,每个版本对应一个OpenGL版本。 OpenGL ES 2.0及更高版本具有单独的GLSL版本。
我正在尝试使用 Three.WebGLRenderTarget 生成纹理,然后在下一阶段的片段着色器中访问它。 这个想法是运行第一阶段一次以生成复杂且昂贵的......
Visual Studio 调试器对于调试我的 OpenGL 代码有用吗?
是否可以使用 Visual Studio 调试器来调试我的 GLFW/OpenGL 代码?我在 glDrawElements() 调用上遇到异常,它提供了无用的信息。显然我没有正确设置...
我已经遵循了 PBR 的 LearnOpenGL 教程并获得了附加的输出,虽然看起来不错,但我注意到我在 sketchfab 或 UE5 中看到的结果更加真实,因此我试图了解...
我正在做一个使用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; }
如何修复 THREE.js 上的 GLSS 着色,使其显示地球上准确的昼夜周期?
我正在为一个项目开发地球 3D 模型,但遇到了问题。最初,我没有使用任何着色,并将两种材质添加到一个组中,并使用 THREE.AdditiveBlending。这导致了......
我正在尝试遵循shadertoy 中的一些示例。 我正在使用我之前读过的《The Book of Shaders》作者的 GlslCanvas 库,但显然 Shadertoy 使用了一些不同的...
我一整天都在搞乱这个,我确信在这一点上我错过了一些愚蠢的东西。 本质上,我正在尝试在 GLSL 着色器中实现顶点变换链。 这很有效...
我使用以下顶点着色器绘制一个抗锯齿圆角正方形作为地平面,以便模型位于顶部: #版本330 输出 vec2 tex; 统一mat4 mvp; const vec2 pos[4] = vec2[]( vec2(...
我一直在使用 OpenGL,对绑定、位置及其索引有点困惑。 我的想法是位置主要用于基元,可以很容易地传递...
shaderc IncluderInterface,包含失败?
我正在尝试在 Vulkan 项目中支持 glsl 的 #include 指令。 据我了解,所需要做的就是正确实现 IncluderInterface 并设置它,我是这样做的: c...
我需要将标量值映射到范围为 0 到 1 的颜色。它将从绿色变为红色(从 0 到 1) 使用纹理坐标进行线性插值(范围也从 0 到 1) 我已经想通了...
我需要将标量值映射到范围为 0 到 1 的颜色。它将从绿色变为红色(从 0 到 1) 使用纹理坐标进行线性插值(范围也从 0 到 1) 我已经想通了...
GeoGebra/Excel 的结果和我的 GLSL 着色器上的结果不一样
我有这个小代码可以计算给定x的alpha。这很简单: 浮点 a(浮点 x) { // 细分 = 4 且 sizeRatio = 1 x = x * 细分; 浮点数 i = int(x); 返回战俘((...
我不知道这种问题是否适合堆栈溢出,但这里是: 我有这个小代码可以计算给定 x 的 alpha 值。这很简单: 浮点 a(浮点 x) { // 细分...
我正在寻找在 GLSL 上使用光线追踪来模拟反射效果,但是我找不到与此主题相关的良好参考、示例或教程。当我得到一些有趣的数据时,...
均匀采样器2D纹理Y; 均匀采样器2D纹理UV; 统一 int 矩形宽度; vec4 gl_FragCoord 中的布局(origin_upper_left); 无效主(无效) { 已经...
Flutter Shaders 语法错误,意外的 VEC3,需要逗号或分号
我正在使用 Flutter 着色器,但收到以下错误: 语法错误、意外的 VEC3、需要逗号或分号 这是我的着色器: #包括...
Flutter Shaders 错误:'exp':找不到匹配的重载函数
我尝试按照 The Book of Shaders 中的示例来学习 Flutter 中的着色器,但出现以下错误: “exp”:找不到匹配的重载函数 这是我的着色器: #