Jump to content
  • Advertisement
Sign in to follow this  
reaperrar

OpenGL Draw a circle with a shader

This topic is 2483 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Im trying to draw a circle (in a 2D world) with a shader. I don't know if I'm miles off or if it is even possible what I'm doing.

I'm drawing a quad with GL_TRIANGLE_STRIP, though the square is always fully coloured, whereas I'm trying to only colour pixels a certain distance from its origin.

Here are my two shaders:

Vertex

#version 330

// Defaultcircle.vert

precision highp float;

uniform mat3 ProjectionMatrix;
uniform mat3 ViewMatrix;
uniform mat3 ModelMatrix;
uniform vec4 ColourIn;
uniform float RadiusSqr;

in vec2 Position;

out vec4 ColourOut;
out vec3 OriginPositionAndRadiusSqrOut;
varying vec3 pos;

void main()
{
mat3 mvpMatrix = ProjectionMatrix * ViewMatrix * ModelMatrix;
pos = vec3(Position.x, Position.y, 1.0);
pos = mvpMatrix * pos;

gl_Position.x = pos.x;
gl_Position.y = pos.y;
gl_Position.z = 0.0;
gl_Position.w = 1.0;

ColourOut = ColourIn;
OriginPositionAndRadiusSqrOut.x = mvpMatrix[2][0];
OriginPositionAndRadiusSqrOut.y = mvpMatrix[2][1];
OriginPositionAndRadiusSqrOut.z = RadiusSqr;
}



frag


#version 330
// Defaultcircle.frag

precision highp float;

in vec4 ColourOut;
in vec3 OriginPositionAndRadiusSqrOut;
varying vec3 pos;

out vec4 FragColor;

void main()
{
if ( (OriginPositionAndRadiusSqrOut.x - pos.x) * (OriginPositionAndRadiusSqrOut.x - pos.x)
+ (OriginPositionAndRadiusSqrOut.y - pos.y) * (OriginPositionAndRadiusSqrOut.y - pos.y)
< OriginPositionAndRadiusSqrOut.z)
{
FragColor = ColourOut;
}
else
{
FragColor = vec4(0.0, 0.0, 0.0, 0.0);
}
}



I know what I have is wrong (And I am a noob at opengl/shaders). Any help is appreciated...

Share this post


Link to post
Share on other sites
Advertisement
The easier method is to set texture coordinates such that the vertices have texture coordinates equal to (-1,1), (1,1), (1,-1) and (-1,-1). In the fragment shader you then simply discard all the fragments with s^2 + t^2 > 1 (where s and t are the two texture coordinates).

Share this post


Link to post
Share on other sites
I'd imagine that would be much better performance wise. Thx for your reply, but for the sake of not ignoring something that I can't do because there is an easier way... why did what I was trying to do fail?

Share this post


Link to post
Share on other sites
Why do you use projection, view and model matrices in 2D? How are those matrices defined? There may be several reasons for your code to be wrong.

Share this post


Link to post
Share on other sites
Do you really need it to be that exact? If you just use a texture with alpha and a circle on it. Where the top/left/bottom/right points of the circle hit the edge of the texture. You can scale the quad and still have about the same thing. Or do you only want individual pixels on your monitor: a circle that is always 1 pixel in width regardless of how big or close it is to the camera?

Share this post


Link to post
Share on other sites

Why do you use projection, view and model matrices in 2D? How are those matrices defined? There may be several reasons for your code to be wrong.


My view matrix is just an identity matrix atm (may be changed later). Model matrix contains the world translation/rotation/scale of w/e object is to be rendered. My projection matrix is defined like this:

m_oProjectionMatrix.m_fMat[0] = (2.0f / (a_fRight - a_fLeft));
m_oProjectionMatrix.m_fMat[1] = 0.0f;
m_oProjectionMatrix.m_fMat[2] = 0.0f;

m_oProjectionMatrix.m_fMat[3] = 0.0f;
m_oProjectionMatrix.m_fMat[4] = (2.0f / (a_fTop - a_fBottom));
m_oProjectionMatrix.m_fMat[5] = 0.0f;

m_oProjectionMatrix.m_fMat[6] = -(a_fRight + a_fLeft) / (a_fRight - a_fLeft);
m_oProjectionMatrix.m_fMat[7] = -(a_fTop + a_fBottom) / (a_fTop - a_fBottom);
m_oProjectionMatrix.m_fMat[8] = 1.0f;

Where:
Left = left side of the screen coordinate (currently 0)
Right = right side of the screen coordinate (currently 1024)
Top = right side of the screen coordinate (currently 0)
Bottom= right side of the screen coordinate (currently 768)

The projection matrix part I don't fully understand why it is needed or why the math works like this. All I know is If I take it out nothing is rendered.

dpadam450, I just want to know how... mainly to deepen my knowledge of how shaders work.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!