glsl 相关问题

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

如何使用 WebGL 和 GLSL 在 J/s 文件中运行 Shadertoy 中的着色器?

我是着色器编程新手,我想使用 WebGL 和 GLSL 创建着色器。为了了解它的实际工作原理,我想测试 Shadertoy 的着色器。但是如何从 Shadertoy 获取代码并

回答 2 投票 0

访问顶点着色器中的纹理数据以进行实例化

无需调试,只需尝试理解一些概念性的东西。 我正在按照本教程根据文本纹理的 Alpha 值创建实例化粒子。我对鲥鱼还是个新手...

回答 1 投票 0

在顶点着色器中应用 Y 旋转时纹理坐标发生偏移

我正在尝试从着色器中的两个三角形旋转平面。 一切都很顺利,除了我无法理解当我应用旋转时 UV 坐标值会发生什么。 我如何执行此操作

回答 1 投票 0

GLError 1281 glGetUniformLocation 中的值无效

我编写了一个着色器类,由于某种原因我收到一个错误: OpenGL.error.GLError: GLError( 错误=1281, 描述 = b'无效值', 基本操作 = glGetUniformLocation, c争论...

回答 1 投票 0

OpenGL 中的非渐变颜色变化

我正在尝试逐渐将三角形的颜色更改为光谱上的每种颜色。颜色基本上在渲染循环的每次迭代中逐渐变化,并将颜色信息传递给

回答 1 投票 0

为什么 GLSL 着色器将深色变为绿色

这是我的 GLSL 着色器,用于输入纹理数据。 vec3 ExtractColor(vec3 Color, float LumaMask) { 浮点亮度 = 点(颜色, vec3(1)); float ColorMask = exp(-Luma * 2 * PI / LumaMask); 科罗拉多州...

回答 1 投票 0

如何调试 GLSL 着色器?

我需要调试一个GLSL程序,但我不知道如何输出中间结果。 是否可以使用 GLSL 进行一些调试跟踪(如 printf)?

回答 13 投票 0

如何实现着色器来创建高光/阴影?

如何实现着色器来创建高光/阴影?我找到了高亮部分的代码(取自https://gitlab.bestminr.com/bestminr/FrontShaders/blob/master/shaders/),但我无法...

回答 2 投票 0

OpenGL ES 2.0 上的着色器与 WebGL 上的着色器的工作方式不同

我在shadertoy.com上创建了一个波动方程着色器:您可以通过链接https://www.shadertoy.com/view/dtsyD2查看它的工作原理 然后我将代码复制到使用 GLES 2.0 的 Android 项目中,c...

回答 1 投票 0

帧缓冲区纹理未传递到着色器且未显示在屏幕上

我正在编写一个程序,可以通过着色器合成两个图像并将结果保存在本地。简单地输出到视口会切断屏幕像素,我想使其无窗口,所以我

回答 1 投票 0

OpenGL SSAO 白色发光边缘/出血神器

我正在尝试在我的游戏引擎中实现高质量的 SSAO,我使用 OpenGL 作为主要渲染 API 和 GLSL 着色器。到目前为止,结果还不错,说实话我真的

回答 0 投票 0

Vulkan SDK中有静态代码分析工具吗?

Vulkan SDK或其他地方有静态代码分析(GLSL 460)的工具吗?我需要从命令行启动工具并获取有关语法错误的输出(也许还有其他错误),什么都没有...

回答 0 投票 0

如何更改openGL中像素的大小

我想创建一个老式的像素游戏引擎。有没有可能的方法在分辨率较低的屏幕上渲染某些内容? 我尝试通过创建屏幕缓冲区在 CPU 上进行渲染,然后...

回答 1 投票 0

push_constant 无法在 Windows/NVIDIA 上与 Vulkan 正常工作?

我正在尝试渲染一个简单的网格并按照此处提供的指南测试一些 GLSL 生成的噪声。我正在使用Vulkan的push_constant功能来传输所需的矩阵,分辨率......

回答 0 投票 0

显式 uv.x 值与长度函数形成一条水平线

我正在尝试更好地处理像 glsl 这样复杂的东西,但是需要一些时间来掌握来自 PHP/JS 背景的某些概念。 在下面的片段着色器代码中,我不...

回答 1 投票 0

GLSL着色器是否有可读取信息的最大限制?

我在 C++ 20 中使用带有 GLFW 和 GLAD 的 OpenGL 4.5,我正在尝试制作一个着色器,使用 Blinn-Phong 算法计算不同功能(点、方向、点)的多个光源,但是.. .

回答 1 投票 0

Raymarching Clamping coordinate makes weird stretched artifacts

我正在尝试使用光线行进渲染球体网格。 SDF 函数如下所示: 浮动 sq_layer(vec3 p,vec3 bounding_box_min,vec3 bounding_box_max) { float cell_size = 4.0 / 16.0...

回答 1 投票 0

网格线宽度不均匀

我正在使用以下片段着色器代码绘制网格: 精度 highp 浮点数; 统一 vec2 CANVAS_SIZE; 统一浮动 GRID_WIDTH; 统一 vec4 GRID_COLOR; float isGridLine(float ordinate, f...

回答 0 投票 0

C++ GLSL 着色器:“错误:不支持 GLSL 3.30。支持的版本有:1.10、1.20、1.30、1.00 ES 和 3.00 ES”或黑窗

我在我的简单 OpenGL 项目中添加了非常简单的 GLSL 着色器,但它无法正常工作。 #包括 #包括 #包括 #包括 我在简单的 OpenGL 项目中添加了非常简单的 GLSL 着色器,但它无法正常工作。 #include <python3.6m/Python.h> #include <iostream> #include <GL/glew.h> #include <GLFW/glfw3.h> #include <glm/glm.hpp> #include <vector> #include <fstream> #include <sstream> using namespace glm; GLuint LoadShaders(const char * vertex_file_path, const char * fragment_file_path){ // Создаем шейдеры GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER); GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); // Загружаем код Вершинного Шейдера из файла std::string VertexShaderCode; std::ifstream VertexShaderStream(vertex_file_path, std::ios::in); if (VertexShaderStream.is_open()) { std::stringstream sstr; sstr << VertexShaderStream.rdbuf(); VertexShaderCode = sstr.str(); VertexShaderStream.close(); } // Загружаем код Фрагментного шейдера из файла std::string FragmentShaderCode; std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in); if (FragmentShaderStream.is_open()){ std::stringstream sstr; sstr << FragmentShaderStream.rdbuf(); FragmentShaderCode = sstr.str(); FragmentShaderStream.close(); } GLint Result = GL_FALSE; int InfoLogLength; // Компилируем Вершинный шейдер printf("Компиляция шейдера: %s\n", vertex_file_path); char const * VertexSourcePointer = VertexShaderCode.c_str(); glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL); glCompileShader(VertexShaderID); // Выполняем проверку Вершинного шейдера glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result); glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); if ( InfoLogLength > 0 ){ std::vector<char> VertexShaderErrorMessage(InfoLogLength+1); glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]); fprintf(stdout, "%s\n", &VertexShaderErrorMessage[0]); } // Компилируем Фрагментный шейдер printf("Компиляция шейдера: %s\n", fragment_file_path); char const * FragmentSourcePointer = FragmentShaderCode.c_str(); glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , NULL); glCompileShader(FragmentShaderID); // Проверяем Фрагментный шейдер glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result); glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); if ( InfoLogLength > 0 ){ std::vector<char> FragmentShaderErrorMessage(InfoLogLength+1); glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]); fprintf(stdout, "%s\n", &FragmentShaderErrorMessage[0]); } // Создаем шейдерную программу и привязываем шейдеры к ней fprintf(stdout, "Создаем шейдерную программу и привязываем шейдеры к ней\n"); GLuint ProgramID = glCreateProgram(); glAttachShader(ProgramID, VertexShaderID); glAttachShader(ProgramID, FragmentShaderID); glLinkProgram(ProgramID); // Проверяем шейдерную программу glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result); glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength); if (InfoLogLength > 0) { std::vector<char> ProgramErrorMessage(InfoLogLength+1); glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]); fprintf(stdout, "%s\n", &ProgramErrorMessage[0]); } glDeleteShader(VertexShaderID); glDeleteShader(FragmentShaderID); return ProgramID; } int main(int argc, char *argv[]) { // Инициализируем GLFW if (!glfwInit()) { fprintf( stderr, "Ошибка при инициализации GLFW\n" ); return -1; } glfwDefaultWindowHints(); glfwWindowHint(GLFW_SAMPLES, 4); // Включаем сглаживание glEnable(GL_MULTISAMPLE); // glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // Мы хотим использовать OpenGL 3.3 // glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // To make MacOS happy; should not be needed // glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // Мы не хотим старый OpenGL // Открыть окно и создать в нем контекст OpenGL GLFWwindow* window; // (В сопроводительном исходном коде эта переменная является глобальной) window = glfwCreateWindow(1024, 768, "Tutorial 01", NULL, NULL); if (window == NULL) { fprintf( stderr, "Невозможно открыть окно GLFW. Если у вас Intel GPU, то он не поддерживает версию 3.3. Попробуйте версию уроков для OpenGL 2.1.\n" ); glfwTerminate(); return -1; } glfwMakeContextCurrent(window); // Инициализируем GLEW glewExperimental=true; // Флаг необходим в Core-режиме OpenGL if (glewInit() != GLEW_OK) { fprintf(stderr, "Невозможно инициализировать GLEW\n"); return -1; } GLuint VertexArrayID; glGenVertexArrays(1, &VertexArrayID); glBindVertexArray(VertexArrayID); // Массив 3 векторов, которые являются вершинами треугольника static const GLfloat g_vertex_buffer_data[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.5f, 1.0f, 0.0f, }; // Это будет идентификатором нашего буфера вершин GLuint vertexbuffer; // Создадим 1 буфер и поместим в переменную vertexbuffer его идентификатор glGenBuffers(1, &vertexbuffer); // Сделаем только что созданный буфер текущим glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); // Передадим информацию о вершинах в OpenGL glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW); // Включим режим отслеживания нажатия клавиш, для проверки ниже glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE); // Создать и откомпилировать нашу шейдерную программу GLuint programID = LoadShaders( "SimpleVertexShader.vertexshader", "SimpleFragmentShader.fragmentshader" ); do { // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Устанавливаем наш шейдер текущим // glUseProgram(programID); // Рисуем треугольник... // Указываем, что первым буфером атрибутов будут вершины glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); glVertexAttribPointer( 0, // Атрибут 0. Подробнее об этом будет рассказано в части, посвященной шейдерам. 3, // Размер GL_FLOAT, // Тип GL_FALSE, // Указывает, что значения не нормализованы 0, // Шаг (void*) nullptr // Смещение массива в буфере ); // Вывести треугольник! glDrawArrays(GL_TRIANGLES, 0, 3); // Начиная с вершины 0, всего 3 вершины -> один треугольник glDisableVertexAttribArray(0); // Сбрасываем буферы glfwSwapBuffers(window); glfwPollEvents(); } // Проверяем нажатие клавиши Escape или закрытие окна while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS && glfwWindowShouldClose(window) == 0); } 我看到黑色的窗口(如果我写 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 否则我看到错误: 编译着色器:SimpleVertexShader.vertexshader 0:1(10):错误:不支持 GLSL 3.30。支持的版本有:1.10、1.20、1.30、1.00 ES 和 3.00 ES *编译着色器:SimpleFragmentShader.fragmentshader * 创建着色器程序并链接... 错误:链接未编译/未专门化的着色器 ) 顶点着色器: #version 300 es layout(location = 0) in vec3 vertexPosition_modelspace; void main(){ gl_Position.xyz = vertexPosition_modelspace; gl_Position.w = 1.0; } 片段着色器: #version 300 es precision mediump float; layout(location = 0) out vec3 color; void main() { color = vec3(1,0,0); } 这里注意: GLuint programID = ... 您实际上可能成功地创建并链接了您的程序对象,但您从未激活它!您必须在抽签之前的某处添加glUseProgram(programID)。

回答 1 投票 0

似乎无法在 Pyglet 2 中绘制顶点列表

我正在尝试熟悉 Pyglet 2 中的图形系统。我对旧版本的 OpenGL 有一定的了解。我找不到任何最新的示例代码。我建立了以下......

回答 1 投票 0

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