현재 오픈 소스 GUI SFML 기반 라이브러리를 개발하고 있지만 셰이더를 사용하여 조금 어려움을 겪고 있습니다. 지금까지 나는 쉐이더를 문제없이 렌더링했지만, 현재의 객체에 쉐이더를 적용하는 대신 전체 윈도우에 적용했지만 객체 범위에서만 볼 수 있습니다.셰이더가 창 대신 캔버스로 vertexArray를 가져옴
여기 내 간단한 코드입니다 :
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <iostream>
const char *glsl = R"(
#version 330 core
uniform vec2 u_resolution;
void main() {
vec2 pos = gl_FragCoord.xy/u_resolution;
float radius = 0.4;
float d = distance(pos, vec2(0.5));
gl_FragColor = d <= radius ? vec4(pos.y,pos.y/2.,pos.y, 1.0) : vec4(d*0.8, d*0.8, d*0.8, 1.0);
//gl_FragColor = vec4(0.0, 0.5, 1.0, 1.0);
}
)";
const char *pos = R"(
// some default shader I've found
// adding #version 330 core will complain for outdated gl_Position variable..
void main() {
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_FrontColor = gl_Color;
}
)";
int main() {
sf::RenderWindow window(sf::VideoMode(800, 600), "GLSL", sf::Style::Default);
// create a quad
sf::VertexArray quad(sf::Quads, 4);
// define it as a rectangle, located at (10, 10) and with size 100x100
quad[0].position = sf::Vector2f(100, 100);
quad[1].position = sf::Vector2f(410, 100);
quad[2].position = sf::Vector2f(410, 410);
quad[3].position = sf::Vector2f(100, 410);
sf::Shader shader;
// the following line is the same as shader.loadFromMemory(pos, glsl);
shader.loadFromMemory(glsl, sf::Shader::Fragment);
shader.setUniform("u_resolution", sf::Vector2f(800, 600));
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed)
window.close();
}
window.clear(sf::Color(244,244,244));
window.draw(quad, &shader);
window.display();
}
return 0;
}
지금까지 수행하지만 pos
셰이더는 렌더링을 수행하는 방법에 영향을해야한다고 생각 무엇인지 확실하지. 감사!
는 일을 할 것 같다,하지만 조금 하드 보인다. 내가 더 좋은 것을 얻지 못한다면 나는 이것을 대답으로 삼을 것이다. 고마워! –
@RazvanAlex "하드 코딩 된"이란 무엇을 의미합니까? – Mario
실제로 quad textCoords를 설정하시오 –