Пример #1
0
        static void bindSkyMatrix(shader_prog_t shader, Matrix4 modelViewMat, Matrix4 projectionMat)
        {
            Matrix4     model;
            SceneCamera cam;
            Matrix4     cameraTransl;
            Matrix4     cameraRot;
            Matrix4     MV;

            model = Matrix4.Identity;
            cam   = AlethaApplication.camera;

            cameraTransl = Matrix4.CreateTranslation(-cam.Position - new Vector3(0, 0, Config.playerHeight));

            cameraRot = Matrix4.CreateFromQuaternion(cam.Orientation);

            MV = (model * cameraTransl) * cameraRot;

            skyboxMat = modelViewMat; //mat4.set(modelViewMat, this.skyboxMat);
                                      //skyboxMat = Matrix4.Identity;
                                      //skyboxMat = new Matrix4(modelViewMat.Row0, modelViewMat.Row1, modelViewMat.Row2, modelViewMat.Row3);

            //skyboxMat = Matrix4.Identity * AlethaApplication.camera.GetWorldOrientation();



            // Clear out the translation components
            //skyboxMat.M12 = 0.0f;
            //skyboxMat.M13 = 0.0f;
            //skyboxMat.M14 = 0.0f;

            // Set uniforms
            GL.UniformMatrix4(shader.uniform["modelViewMat"], false, ref skyboxMat);
            GL.UniformMatrix4(shader.uniform["projectionMat"], false, ref projectionMat);
        }
Пример #2
0
        public ShaderCompiler()
        {
            white          = -1;
            defaultShader  = null;
            defaultTexture = -1;
            texMat         = Matrix4.Identity; // mat4.create()
            defaultProgram = null;

            //defaultShader = buildDefault(null);

            //defaultProgram = compileShaderProgram(Config.q3bsp_default_vertex, Config.q3bsp_default_fragment);
        }
Пример #3
0
        public void bindSkyTexture(stage_gl stage, shader_prog_t program, float time)
        {
            //map.render();

            //    if(type == skybox_type.one_tex)
            //    {
            //if(skymap == null) { skymap = q3bsp.glshading.defaultTexture; }

            GL.ActiveTexture(TextureUnit.Texture0);
            GL.Uniform1(program.uniform["texture"], 0);
            GL.BindTexture(TextureTarget.TextureCubeMap, skymap);


            //    }
            //    else if(type == skybox_type.six_tex)
            //    {
            //
            //    }
        }
Пример #4
0
        static void bindSkyAttribs(shader_prog_t shader)
        {
            // Setup vertex attributes
            GL.EnableVertexAttribArray(shader.attrib["position"]);
            GL.VertexAttribPointer(shader.attrib["position"],
                                   3,
                                   VertexAttribPointerType.Float,
                                   false,
                                   Config.q3bsp_sky_vertex_stride,
                                   0);

            if (shader.attrib.ContainsKey("texCoord"))
            {
                GL.EnableVertexAttribArray(shader.attrib["texCoord"]);
                GL.VertexAttribPointer(shader.attrib["texCoord"],
                                       2,
                                       VertexAttribPointerType.Float,
                                       false,
                                       Config.q3bsp_sky_vertex_stride,
                                       3 * 4);
            }
        }
Пример #5
0
        /// <summary>
        /// Shader program compilation
        /// </summary>
        public shader_prog_t compileShaderProgram(string vertexSrc, string fragmentSrc)
        {
            int fragmentShader = GL.CreateShader(ShaderType.FragmentShader);

            GL.ShaderSource(fragmentShader, fragmentSrc);
            GL.CompileShader(fragmentShader);
            String si;

            int i;
            int attribCount;
            int uniformCount;

            //var xf = GL.getShaderParameter(fragmentShader, RenderingContext.COMPILE_STATUS);
            si = GL.GetShaderInfoLog(fragmentShader);
            //if (!(xf != null && xf == true))

            if (!string.IsNullOrEmpty(si.Trim()))
            {
                si = si == null ? "" : si;

                Console.WriteLine("[shader-exception] fragment compilation error " + si);

                if (shader_source_tracing)
                {
                    Console.WriteLine("[shader].[begin]");
                    Console.WriteLine(vertexSrc);
                    Console.WriteLine("[shader].[end]");
                    Console.WriteLine("[shader].[begin]");
                    Console.WriteLine(fragmentSrc);
                    Console.WriteLine("[shader].[end]");
                }

                GL.DeleteShader(fragmentShader);
                return(null);
            }

            int vertexShader = GL.CreateShader(ShaderType.VertexShader);

            GL.ShaderSource(vertexShader, vertexSrc);
            GL.CompileShader(vertexShader);

            //var xv = GL.getShaderParameter(vertexShader, RenderingContext.COMPILE_STATUS);
            si = GL.GetShaderInfoLog(vertexShader);

            //if (!(xv != null && xv == true))

            if (!string.IsNullOrEmpty(si.Trim()))
            {
                si = si == null ? "" : si;

                Console.WriteLine("[shader-exception] vertex compilation error: " + si);
                if (shader_source_tracing)
                {
                    Console.WriteLine("[shader].[begin]");
                    Console.WriteLine(vertexSrc);
                    Console.WriteLine("[shader].[end]");
                    Console.WriteLine("[shader].[begin]");
                    Console.WriteLine(fragmentSrc);
                    Console.WriteLine("[shader].[end]");
                }

                GL.DeleteShader(vertexShader);
                return(null);
            }

            int shaderProgram = GL.CreateProgram();

            GL.AttachShader(shaderProgram, vertexShader);
            GL.AttachShader(shaderProgram, fragmentShader);
            GL.LinkProgram(shaderProgram);

            //var xp = GL.getProgramParameter(shaderProgram, RenderingContext.LINK_STATUS);

            si = GL.GetProgramInfoLog(shaderProgram);

            //if (!(xp != null && xp == true))
            if (!string.IsNullOrEmpty(si.Trim()))
            {
                GL.DeleteProgram(shaderProgram);
                GL.DeleteShader(vertexShader);
                GL.DeleteShader(fragmentShader);

                Console.WriteLine("[shader-exception] Could not link shaders. Check if there are any additional errors.");

                /*
                 * console.debug(vertexSrc);
                 * console.debug(fragmentSrc);*/
                return(null);
            }

            shader_prog_t shader_prog = new shader_prog_t();

            shader_prog.program = shaderProgram;
            shader_prog.attrib  = new Dictionary <string, int>();
            shader_prog.uniform = new Dictionary <string, int>();

            // SHADER PROGRAM INTROSPECTION

            GL.GetProgramInterface(shaderProgram, ProgramInterface.ProgramInput, ProgramInterfaceParameter.ActiveResources, out attribCount);
            GL.GetProgramInterface(shaderProgram, ProgramInterface.Uniform, ProgramInterfaceParameter.ActiveResources, out uniformCount);

            string name;

            ProgramProperty[] properties;
            int[]             values;
            int           length;
            StringBuilder nameBuilder;

            properties = new ProgramProperty[]
            {
                ProgramProperty.NameLength,
                ProgramProperty.Type,
                ProgramProperty.ArraySize
            };

            values      = new int[properties.Length];
            nameBuilder = new StringBuilder();

            for (i = 0; i < attribCount; i++)
            {
                GL.GetProgramResource(shaderProgram, ProgramInterface.ProgramInput, i, properties.Length, properties, values.Length, out length, values);

#pragma warning disable
                GL.GetProgramResourceName(shaderProgram, ProgramInterface.ProgramInput, i, 256, out length, nameBuilder);
#pragma warning restore

                name = nameBuilder.ToString();

                shader_prog.attrib[name] = GL.GetAttribLocation(shaderProgram, name);
            }

            for (i = 0; i < uniformCount; i++)
            {
                GL.GetProgramResource(shaderProgram, ProgramInterface.Uniform, i, properties.Length, properties, values.Length, out length, values);

#pragma warning disable
                GL.GetProgramResourceName(shaderProgram, ProgramInterface.Uniform, i, 256, out length, nameBuilder);
#pragma warning restore

                name = nameBuilder.ToString();

                shader_prog.uniform[name] = GL.GetUniformLocation(shaderProgram, name);
            }

            return(shader_prog);
        }
Пример #6
0
        public void init()
        {
            white = createSolidTexture(new Vector4(255, 255, 255, 0));
            //white = createSolidTexture(gl, [0,0,0,255]);

            defaultProgram = compileShaderProgram(Config.q3bsp_default_vertex, Config.q3bsp_default_fragment);
            modelProgram   = compileShaderProgram(Config.q3bsp_default_vertex, Config.q3bsp_model_fragment);


            // Load default texture
            texture.fetch_texture(Config.q3bsp_no_shader_default_texture_url, (int defau) =>
            {
                defaultTexture = defau;
            },
                                  (int defau, Bitmap image) =>
            {
                bool isPowerOf2 = false;
                BitmapData pixelData;
                Rectangle boundingbox;

                boundingbox = new Rectangle(0, 0, image.Width, image.Height);

                pixelData = image.LockBits(boundingbox,
                                           System.Drawing.Imaging.ImageLockMode.ReadOnly,
                                           System.Drawing.Imaging.PixelFormat.Format32bppArgb);

                GL.BindTexture(TextureTarget.Texture2D, defau);
                GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, image.Width, image.Height, 0, OpenTK.Graphics.OpenGL4.PixelFormat.Bgra, PixelType.UnsignedByte, pixelData.Scan0);
                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (isPowerOf2 ? (int)TextureMinFilter.LinearMipmapNearest : (int)TextureMinFilter.Linear));
                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);

                if (isPowerOf2)
                {
                    GL.GenerateMipmap(GenerateMipmapTarget.Texture2D);
                }

                image.UnlockBits(pixelData);
            });
            texture.fetch_texture(Config.q3bsp_no_shader_default_texture_url2, (int defau) =>
            {
                defaultTextureRed = defau;
            },
                                  (int defau, Bitmap image) =>
            {
                bool isPowerOf2 = false;
                BitmapData pixelData;
                Rectangle boundingbox;

                boundingbox = new Rectangle(0, 0, image.Width, image.Height);

                pixelData = image.LockBits(boundingbox,
                                           System.Drawing.Imaging.ImageLockMode.ReadOnly,
                                           System.Drawing.Imaging.PixelFormat.Format32bppArgb);

                GL.BindTexture(TextureTarget.Texture2D, defau);
                GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, image.Width, image.Height, 0, OpenTK.Graphics.OpenGL4.PixelFormat.Bgra, PixelType.UnsignedByte, pixelData.Scan0);
                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (isPowerOf2 ? (int)TextureMinFilter.LinearMipmapNearest : (int)TextureMinFilter.Linear));
                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);

                if (isPowerOf2)
                {
                    GL.GenerateMipmap(GenerateMipmapTarget.Texture2D);
                }
            });

            // Load default stage
            defaultShader = buildDefault(null);
        }