gpt4 book ai didi

c++ - 在 OpenGL 应用程序中动态更改着色器

转载 作者:行者123 更新时间:2023-11-28 05:56:44 25 4
gpt4 key购买 nike

我想在我的程序中使用着色器更改对象的颜色 - 准确地说是片段着色器。

我有两个着色器程序:长方体、三角形(名称是随机的——只是为了便于引用)。对于这两个程序,我使用相同的顶点着色器:

#version 330 core
layout (location = 0) in vec3 position;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

vec3 pos;

void main()
{
gl_Position = projection * view * model * vec4(position, 1.0f);
}

然后我正在使用我的 box_shader 程序:

box_shader.Use();

// Create camera transformation
view = camera.GetViewMatrix();
glm::mat4 projection;
projection = glm::perspective(camera.Zoom, (float)WIDTH/(float)HEIGHT, 0.1f, 100.0f);

// Get the uniform locations
GLint modelLoc = glGetUniformLocation(box_shader.Program, "model");
GLint viewLoc = glGetUniformLocation(box_shader.Program, "view");
GLint projLoc = glGetUniformLocation(box_shader.Program, "projection");
// Pass the matrices to the shader
glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projection));

稍后在程序中我想使用triangle_shader 程序。我正在尝试的是:

triangl_shader.Use()
DrawTraingles();

所以我不再调用 glGetUniformLocation,而是使用之前创建的那些。不幸的是,我没有看到使用 DrawTraingles() 绘制的三角形,尽管当我不切换着色器程序时它们会出现。

对于我的着色器加载和使用,我使用了这个类:learnopengl所以关于 Use() 函数的一切都在那里。

谁能告诉我应该如何使用不同的着色器?

编辑:

我想到的是在 packet_shader.Use() 之后添加 glGetUniformLocations,所以它现在看起来像这样:

packet_shader.Use();

// Get the uniform locations
modelLoc = glGetUniformLocation(packet_shader.Program, "model");
viewLoc = glGetUniformLocation(packet_shader.Program, "view");
projLoc = glGetUniformLocation(packet_shader.Program, "projection");
// Pass the matrices to the shader
glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projection));

尽管如此,我不确定这是否是性能方面的最佳想法。谁能告诉我可以吗?

最佳答案

制服是 GL 中的每个程序状态。所以这里有两个问题:

  1. 每个项目的统一位置可能完全不同。对于每个程序,您都必须查询统一位置,并且必须将它们单独存储以备后用。
  2. 必须为每个程序单独设置统一值。即使您认为两个程序“共享”同一个制服,情况也并非如此。所有 glUniform*() setter 只影响当前使用的程序。由于您的每个程序都有自己的 modelviewprojection 制服,因此您必须为每个程序设置它们,每次它们发生变化时。目前,您似乎从未为第二个程序设置这些设置,因此它们保留为全零的初始默认值。

如果你想在不同的项目之间共享制服,你可以考虑查看 Uniform Buffer Objects (UBOs) .

关于c++ - 在 OpenGL 应用程序中动态更改着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34006091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com