【问题标题】:Shader in sfml covering entire screensfml 中的着色器覆盖整个屏幕
【发布时间】:2020-04-13 04:41:56
【问题描述】:

我正在用 C++ 和 sfml 制作游戏,我正在使用着色器,它覆盖了整个屏幕窗口。
但我希望它只覆盖屏幕的一部分,例如游戏对象或精灵。

注意:并非主文件中的所有代码都是我的,但它是 sfml 的非常通用的代码,所以...

主文件:

#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 480

#include <SFML/Graphics.hpp>

int main() 
{
    sf::RenderWindow window(sf::VideoMode(SCREEN_WIDTH, SCREEN_HEIGHT), "Shaders!!!", sf::Style::Close);
    window.setFramerateLimit(60);

    sf::Texture texture;
    texture.loadFromFile("EnemyShip.png");

    sf::Sprite sprite(texture); //create a sprite from the created texture

    sf::Shader shader;
    shader.loadFromFile("shader.vert", "shader.frag");

    while (window.isOpen()) 
    {
        sf::Event evnt;

        while (window.pollEvent(evnt)) 
        {
            if (evnt.type == sf::Event::Closed)
            {
                window.close();
            }
        }

        window.clear(sf::Color(255, 255, 255));
        window.draw(sprite, &shader); //draw the sprite with blur shader
        window.display();
    }
    return 0;
}

shader.frag:

#version 330 core
out vec4 FragColor;

in vec4 vertexColor; // the input variable from the vertex shader (same name and same type)  

void main()
{
    FragColor = vertexColor;
}

shader.vert

#version 330 core

in vec2 texCoord;

out vec4 vertexColor;
void main()
{
    gl_Position = vec4(texCoord, 0.0, 1.0);
    vertexColor = vec4(0.5, 0.2, 0.7, 1.0);
}

我是否缺少明显的东西,或者我可以重新配置gl_Position 以仅覆盖屏幕的一部分? (但我怎样才能使屏幕其他“正确”部分的颜色清晰?)

【问题讨论】:

  • “我正在使用着色器,它覆盖了整个屏幕” - 着色器不覆盖任何东西。顶点坐标(和变换)定义了基元覆盖的区域。很可能您必须定义一个转换矩阵。我建议看一个教程,例如LearnOpenGL - Transformations

标签: c++ glsl screen sfml


【解决方案1】:

顶点坐标(和变换)定义了图元覆盖的区域。 您必须定义一个转换矩阵。 (见LearnOpenGL - Transformations

mat4中的uniform变量添加到顶点着色器,通过变换矩阵变换顶点坐标。

#version 330 core

in vec2 texCoord;
out vec4 vertexColor;
uniform mat4 transformMat;

void main()
{
    gl_Position = transformMat * vec4(texCoord, 0.0, 1.0);
    vertexColor = vec4(0.5, 0.2, 0.7, 1.0);
}

在应用程序中,必须定义转换并设置统一 hs。

定义一个sf::Transform 来缩放和平移顶点坐标。例如:

sf::Transform transform;
transform.scale(0.25f, 0.25f);
transform.translate(-0.5f, -0.5f);

从转换中创建一个sf::Glsl::Mat4

sf::Glsl::Mat4 modelMat(transform.getMatrix());

将变换矩阵设置为矩阵统一(sf::Shader::setUniform):

shader.setUniform("transformMat", modelMat);

【讨论】:

  • Sf::Transform transform 出于某种原因需要成为指针。此外,虽然这确实将左下角带到了正确的位置,但它仍然留下了由着色器渲染的巨大区域。另外,如果我在不同的位置有精灵怎么办?
  • @Prolight 对于单个 Stack Overflow 问题来说,这太宽泛了。您必须了解转换。见LearnOpenGL - Transformations
  • 哦,好吧!太多了*(忘记了一个o)
猜你喜欢
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多