Jump to content

View more

Image of the Day

「筋肉兄貴のスーパーラン!」
兄貴に立ちはだかるダンボール・・・(´・ω・`)
ムズい・・激ムズって感じにそろそろ変わってきます。
(o・ω・o)
 #indiedev  #indiegame #screenshotsaturday https://t.co/xKIzRQMdHm
IOTD | Top Screenshots

The latest, straight to your Inbox.

Subscribe to GameDev.net's newsletters to receive the latest updates and exclusive content.


Sign up now

gl_PointSize doesn't work

2: Adsense
  • You cannot reply to this topic
6 replies to this topic

#1 8Observer8   Members   

146
Like
0Likes
Like

Posted 25 February 2017 - 03:20 PM

Hello

I want to draw a point with custom size in C# OpenGL3.3 OpenTK like this: https://jsfiddle.net/8Observer8/cc72u1u5/

But I see the point with size 1 pixel

I attached the project. Everyone can run it in VS 2012 - VS 2015

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using OpenTK;
using OpenTK.Graphics.OpenGL;
using Utils;

namespace HelloPoint1
{
    class MainWindow : GameWindow
    {
        string VSHADER_SOURCE = null;
        string FSHADER_SOURCE = null;

        bool canDraw = false;

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            // Load shaders from files
            ShaderLoader.LoadShader("./Shaders/vShader.glsl", out VSHADER_SOURCE);
            ShaderLoader.LoadShader("./Shaders/fShader.glsl", out FSHADER_SOURCE);
            if (VSHADER_SOURCE == null || FSHADER_SOURCE == null)
            {
                Console.WriteLine("Failed to load shaders from files");
                return;
            }

            // Specify the color for clearing
            GL.ClearColor(Color.Black);

            GL.Enable(EnableCap.ProgramPointSize);

            canDraw = true;
        }

        protected override void OnRenderFrame(FrameEventArgs e)
        {
            base.OnRenderFrame(e);

            if (!canDraw) return;

            GL.Clear(ClearBufferMask.ColorBufferBit);

            // Draw a point
            GL.DrawArrays(PrimitiveType.Points, 0, 1);

            GL.Flush();

            SwapBuffers();
        }
    }
}

Attached Files


Edited by 8Observer8, 25 February 2017 - 03:21 PM.

Sorry if I make mistakes. My English is not good for a while yet.


#2 8Observer8   Members   

146
Like
0Likes
Like

Posted 25 February 2017 - 04:13 PM

If the project "HelloPoint1" doesn't run in your VS please say me about it.


Sorry if I make mistakes. My English is not good for a while yet.


#3 slicer4ever   GDNet+   

6626
Like
0Likes
Like

Posted 25 February 2017 - 05:06 PM

can you provide the source to base.OnLoad(); and base.OnRenderFrame(e);  otherwise i don't even see you setting up vertices, yet alone setting their sizes.


Edited by slicer4ever, 25 February 2017 - 05:10 PM.

Check out https://www.facebook.com/LiquidGames for some great games made by me on the Playstation Mobile market.

#4 8Observer8   Members   

146
Like
0Likes
Like

Posted 26 February 2017 - 02:23 AM

Yes: https://github.com/opentk/opentk


Sorry if I make mistakes. My English is not good for a while yet.


#5 8Observer8   Members   

146
Like
0Likes
Like

Posted 26 February 2017 - 02:52 AM

slicer4ever, can you download and run my project than I attached in first message? Does it run?


Edited by 8Observer8, 26 February 2017 - 02:53 AM.

Sorry if I make mistakes. My English is not good for a while yet.


#6 8Observer8   Members   

146
Like
0Likes
Like

Posted 26 February 2017 - 06:15 AM

I know the solution: https://github.com/opentk/opentk/issues/489#issuecomment-282549309

gl_PointSize doens't work in OpenTK. We need to use GL.PointSize(float) (see glPointSize)


Edited by 8Observer8, 26 February 2017 - 06:15 AM.

Sorry if I make mistakes. My English is not good for a while yet.


#7 8Observer8   Members   

146
Like
1Likes
Like

Posted 28 February 2017 - 11:44 PM

Now it works!
 
PointWithCustomSizeAndColour_512x512.png
 
I forgot to initialise the shaders.
 
 
vShader.glsl
#version 330
 
void main()
{
    gl_Position = vec4(0.8, 0.0, 0.0, 1.0);
    gl_PointSize = 10.0;
}
 
fShader.glsl
#version 330
 
out vec4 fragColor;
 
void main()
{
    fragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
 
Program.cs
namespace PointWithCustomSizeAndColour
{
    class Program
    {
        static void Main(string[] args)
        {
            using (MainWindow mainWindow = new MainWindow())
            {
                mainWindow.Run(30);
            }
        }
    }
}
 
MainWindow.cs
using System;
using System.Drawing;
using OpenTK;
using OpenTK.Graphics.OpenGL;
using System.IO;

namespace PointWithCustomSizeAndColour
{
    class MainWindow : GameWindow
    {
        string vShaderSource = null;
        string fShaderSource = null;

        bool canDraw = false;

        string infoFileName = "info.txt";

        int program;

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            Title = "Point With Custom Size And Colour";
            Width = 512;
            Height = 512;

            // Load shaders from files
            ShaderLoader.LoadShader(infoFileName, "./Shaders/vShader.glsl", out vShaderSource);
            ShaderLoader.LoadShader(infoFileName, "./Shaders/fShader.glsl", out fShaderSource);
            if (vShaderSource == null || fShaderSource == null)
            {
                File.AppendAllText(infoFileName, "Failed to load shaders from files" + Environment.NewLine);
                return;
            }

            // Initialize shaders
            if (!ShaderLoader.InitShaders(vShaderSource, fShaderSource, out program))
            {
                File.AppendAllText(infoFileName, "Failed to initialize the shaders" + Environment.NewLine);
                return;
            }

            // Specify the color for clearing
            GL.ClearColor(Color.Black);

            GL.Enable(EnableCap.ProgramPointSize);

            canDraw = true;
        }

        protected override void OnRenderFrame(FrameEventArgs e)
        {
            base.OnRenderFrame(e);
            GL.Viewport(0, 0, Width, Height);

            if (!canDraw) return;

            GL.Clear(ClearBufferMask.ColorBufferBit);

            // Draw a point
            GL.DrawArrays(PrimitiveType.Points, 0, 1);

            GL.Flush();
            SwapBuffers();
        }
    }
}

 
ShaderLoader.cs
using System.IO;
using OpenTK.Graphics.OpenGL;
using System;
 
namespace PointWithCustomSizeAndColour
{
    class ShaderLoader
    {
        private static string infoFileName = null;
 
        ///<summary>
        ///Create a program object and make current
        ///</summary>
       ///<param name="vShader">a vertex shader program</param>
        ///<param name="fShader">a fragment shader program</param>
        ///<param name="program">created program</param>
        ///<returns>
        ///return true, if the program object was created and successfully made current
        ///</returns>
        public static bool InitShaders(string vShader, string fShader, out int program)
        {
            program = CreateProgram(vShader, fShader);
            if (program == 0)
            {
                File.AppendAllText(infoFileName, "Failed to create program" + Environment.NewLine);
                return false;
            }
 
            GL.UseProgram(program);
 
            return true;
        }
 
        ///<summary>
        ///Load a shader from a file
        ///</summary>
        ///<param name="infoFileName">a file name for errors</param>
        ///<param name="fileName">a file name to a shader</param>
        ///<param name="shaderSource">a shader source string</param>
        public static void LoadShader(string infoFileName, string fileName, out string shaderSource)
        {
            ShaderLoader.infoFileName = infoFileName;
 
            if (File.Exists(infoFileName))
            {
                // Clear File
                File.WriteAllText(infoFileName, "");
            }
 
            shaderSource = null;
 
            using (StreamReader sr = new StreamReader(fileName))
            {
                shaderSource = sr.ReadToEnd();
            }
        }
 
        private static int CreateProgram(string vShader, string fShader)
        {
            // Create shader object
            int vertexShader = LoadShader(ShaderType.VertexShader, vShader);
            int fragmentShader = LoadShader(ShaderType.FragmentShader, fShader);
            if (vertexShader == 0 || fragmentShader == 0)
            {
                return 0;
            }
 
            // Create a program object
            int program = GL.CreateProgram();
            if (program == 0)
            {
                return 0;
            }
 
            // Attach the shader objects
            GL.AttachShader(program, vertexShader);
            GL.AttachShader(program, fragmentShader);
 
            // Link the program object
            GL.LinkProgram(program);
 
            // Check the result of linking
            int status;
            GL.GetProgram(program, GetProgramParameterName.LinkStatus, out status);
            if (status == 0)
            {
                string errorString = string.Format("Failed to link program: {0}" + Environment.NewLine, GL.GetProgramInfoLog(program));
                File.AppendAllText(infoFileName, errorString);
                GL.DeleteProgram(program);
                GL.DeleteShader(vertexShader);
                GL.DeleteShader(fragmentShader);
                return 0;
            }
 
            return program;
        }
 
        private static int LoadShader(ShaderType shaderType, string shaderSource)
        {
            // Create shader object
            int shader = GL.CreateShader(shaderType);
            if (shader == 0)
            {
                File.AppendAllText(infoFileName, "Unable to create shader" + Environment.NewLine);
                return 0;
            }
 
            // Set the shader program
            GL.ShaderSource(shader, shaderSource);
 
            // Compile the shader
            GL.CompileShader(shader);
 
            // Check the result of compilation
            int status;
            GL.GetShader(shader, ShaderParameter.CompileStatus, out status);
            if (status == 0)
            {
                string errorString = string.Format("Failed to compile {0} shader: {1}" + Environment.NewLine, shaderType.ToString(), GL.GetShaderInfoLog(shader));
                File.AppendAllText(infoFileName, errorString);
                GL.DeleteShader(shader);
                return 0;
            }
 
            return shader;
        }
    }
}

Edited by 8Observer8, 01 March 2017 - 01:23 AM.

Sorry if I make mistakes. My English is not good for a while yet.