Jump to content

  • Log In with Google      Sign In   
  • Create Account

GLSL


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
5 replies to this topic

#1 foxcode   Members   -  Reputation: 251

Like
0Likes
Like

Posted 26 February 2014 - 01:49 PM

Hello again, I sometimes feel I ask too many questions on these forums but oh well.

 

A friend of mine made a simple program to draw a fractal. I quickly realized this would work much faster in a shader. Very quickly I ran into alot of problems that didn't make sense, and after 2 hours I come here with a simple question.

I am using sfml 2.1

this is the shader, not the shader for the fractal, just a test

 

uniform sampler2D texture;
 
void main()
{
    vec4 pixel = texture2D(texture, gl_TexCoord[0].xy);
    gl_FragColor = pixel;
}

I have defined my own rectangle as a vertex array in sfml. I load a texture from file, and confirm it is loaded, just a simple png image. I draw the texture in the normal manner to make sure it is loaded. I then try passing the loaded texture, as a parameter using this line, with the goal of drawing the texture myself in the shader

shader.setParameter("texture", picture);

When I finally draw and display however, I get a black screen. I suspect this is because I don't really know GLSL, but in my head at lest, the code looks up the current pixel in the texture, and simply outputs that value from the fragment shader for the current pixel.
 
 


Sponsor:

#2 BitMaster   Crossbones+   -  Reputation: 4431

Like
2Likes
Like

Posted 26 February 2014 - 02:14 PM

First, while this looks (on first glance) like a reasonable fragment shader, there is no vertex shader. Do you have one? Have you verified that both compile correctly? If not, what are the error messages? Have you verified that the program is linked correctly? If not, what are the errors?



#3 foxcode   Members   -  Reputation: 251

Like
0Likes
Like

Posted 26 February 2014 - 02:35 PM

Adding the vertex shader has changed something. Now I am getting a blue screen. When I created my rect, I did define all 4 vertices positions, texcords, and colour blue. This still does not explain why I am not getting the texture I passed into the fragment shader but thank you, it looks like a small piece of the puzzle has been solved.

 

Here is the program code

#include <SFML/Graphics.hpp>

#define Window_Width 512
#define Window_Height 512

int main()
{
  int maxiterations = 255;
  sf::RenderWindow window(sf::VideoMode(Window_Width, Window_Height), "SFML works!");
  sf::VertexArray rectangle(sf::Quads, 4);
  
  sf::Vector2f rectSize(Window_Width,Window_Height);
  
  sf::Vector2f center(Window_Width/2, Window_Height/2);

  sf::Texture picture; //Shader colouring texture

  if(!picture.loadFromFile("logoBig.png"))
  {
  int fuck = 5;
  }

  sf::Shader shader; //Fractal shader
  if(!shader.loadFromFile("mandelbrot.frag", sf::Shader::Fragment)) //Load shader
  {
    int i = 0;
  }
  if(!shader.loadFromFile("vertexshade.vert", sf::Shader::Vertex)) //Load shader
  {
    int i = 0;
  }
 
  while (window.isOpen())
  {
    sf::Event event;
    while (window.pollEvent(event))
    {
      if (event.type == sf::Event::Closed)
        window.close();
    }
    shader.setParameter("texture2", picture);

    //SORT VERTICES
    rectangle[0].position = sf::Vector2f(0, 0);
    rectangle[1].position = sf::Vector2f(Window_Width, 0);
    rectangle[2].position = sf::Vector2f(Window_Width, Window_Height);
    rectangle[3].position = sf::Vector2f(0, Window_Height);

    // define the color of the quad points
    rectangle[0].color = sf::Color::Blue;
    rectangle[1].color = sf::Color::Blue;
    rectangle[2].color = sf::Color::Blue;
    rectangle[3].color = sf::Color::Blue;

    //texture coords
    rectangle[0].texCoords = sf::Vector2f(0, 0);
    rectangle[1].texCoords = sf::Vector2f(Window_Width, 0);
    rectangle[2].texCoords = sf::Vector2f(Window_Width, Window_Height);
    rectangle[3].texCoords = sf::Vector2f(0, Window_Height);

    window.clear();
    
    window.draw(rectangle,&shader);
    window.display();
  }

  return 0;
}

Vertex Shader

void main()
{
    // transform the vertex position
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

    // transform the texture coordinates
    gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;

    // forward the vertex color
    gl_FrontColor = gl_Color;
}

Fragment Shader

uniform sampler2D texture2;

void main()
{
    // lookup the pixel in the texture
    vec4 pixel = texture2D(texture2, gl_TexCoord[0].xy);

    // multiply it by the color
    gl_FragColor = pixel;
}

Edited by foxcode, 26 February 2014 - 03:43 PM.


#4 foxcode   Members   -  Reputation: 251

Like
0Likes
Like

Posted 26 February 2014 - 03:10 PM

Okay, I have figured out what is going on but not why. It turns out that the shader is taking the bottom right pixel in the texture, and applying it to every pixel in the output. I suspect gl_TexCoord[0].xy is always returning the same value, and ideas?



#5 NumberXaero   Prime Members   -  Reputation: 1509

Like
2Likes
Like

Posted 26 February 2014 - 04:01 PM

Try normalized texture coordinates between 0.0 and 1.0 unless you are using texture rectangles, which use unnormalized coordinates, which you have in the example.



#6 foxcode   Members   -  Reputation: 251

Like
0Likes
Like

Posted 26 February 2014 - 04:09 PM

For god sake, why didn't I think of that! Thank you so much, I feel really stupid at times.






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS