コード例 #1
0
        public void Unserialize(GMDataReader reader, int endPos)
        {
            Name = reader.ReadStringPointerObject();
            Type = (ShaderType)(reader.ReadUInt32() & 0x7FFFFFFF);

            GLSL_ES_Vertex   = reader.ReadStringPointerObject();
            GLSL_ES_Fragment = reader.ReadStringPointerObject();
            GLSL_Vertex      = reader.ReadStringPointerObject();
            GLSL_Fragment    = reader.ReadStringPointerObject();
            HLSL9_Vertex     = reader.ReadStringPointerObject();
            HLSL9_Fragment   = reader.ReadStringPointerObject();

            int ptr1 = reader.ReadInt32();

            HLSL11_VertexBuffer = reader.ReadPointer <ShaderBuffer>(ptr1);
            int ptr2 = reader.ReadInt32();

            HLSL11_PixelBuffer = reader.ReadPointer <ShaderBuffer>(ptr2);

            VertexAttributes = new List <GMString>();
            for (int i = reader.ReadInt32(); i > 0; i--)
            {
                VertexAttributes.Add(reader.ReadStringPointerObject());
            }

            if (reader.ReadInt32() != 2)
            {
                reader.Warnings.Add(new GMWarning("expected 2 in SHDR"));
            }

            int ptr3 = reader.ReadInt32();

            PSSL_VertexBuffer = reader.ReadPointer <ShaderBuffer>(ptr3);
            ReadShaderData(reader, PSSL_VertexBuffer, ptr3, reader.ReadInt32());

            int currPtr = reader.ReadInt32();

            PSSL_PixelBuffer = reader.ReadPointer <ShaderBuffer>(currPtr);
            ReadShaderData(reader, PSSL_PixelBuffer, currPtr, reader.ReadInt32());

            currPtr             = reader.ReadInt32();
            CG_PSV_VertexBuffer = reader.ReadPointer <ShaderBuffer>(currPtr);
            ReadShaderData(reader, CG_PSV_VertexBuffer, currPtr, reader.ReadInt32());

            currPtr            = reader.ReadInt32();
            CG_PSV_PixelBuffer = reader.ReadPointer <ShaderBuffer>(currPtr);
            ReadShaderData(reader, CG_PSV_PixelBuffer, currPtr, reader.ReadInt32());

            currPtr             = reader.ReadInt32();
            CG_PS3_VertexBuffer = reader.ReadPointer <ShaderBuffer>(currPtr);
            ReadShaderData(reader, CG_PSV_VertexBuffer, currPtr, reader.ReadInt32());

            currPtr            = reader.ReadInt32();
            CG_PS3_PixelBuffer = reader.ReadPointer <ShaderBuffer>(currPtr);
            ReadShaderData(reader, CG_PSV_PixelBuffer, currPtr, reader.ReadInt32());

            ReadShaderData(reader, HLSL11_VertexBuffer, ptr1, -1, ptr2 == 0 ? endPos : ptr2);
            ReadShaderData(reader, HLSL11_PixelBuffer, ptr2, -1, ptr3 == 0 ? endPos : ptr3);
        }
コード例 #2
0
        private void ReadShaderData(GMDataReader reader, ShaderBuffer buf, int ptr, int length = -1, int end = -1)
        {
            if (buf == null)
            {
                return;
            }

            int returnTo = reader.Offset;

            reader.Offset = ptr;

            if (length == -1)
            {
                buf.Unserialize(reader, end - ptr);
            }
            else
            {
                buf.Unserialize(reader, length);
            }

            reader.Offset = returnTo;
        }
コード例 #3
0
ファイル: SplineTubes.cs プロジェクト: TinyTexel/SplineTubes
        //public int GetNodeId(int bufferId, int localNodeId)
        //{
        //    return cummNodeCount[bufferId] + localNodeId;
        //}
        public SplineTubes(ShaderBufferType shaderBufferType, BufferUsageHint bufferUsageHintType, int bufferMaxElementCount, int[] nodeCount, int segmentElementCount)
        {
            Utils.Assert(bufferElementSize == 1 || bufferElementSize == 2 || bufferElementSize == 4 || bufferElementSize == 8,
                        "bufferElementSize == 1 || bufferElementSize == 2 || bufferElementSize == 4 || bufferElementSize == 8");

            Utils.Assert(nodeCount.Length > 0,
                        "nodeCount.Length > 0");

            if (shaderBufferType == ShaderBufferType.UBO)
            {
                if(bufferMaxElementCount > 0)
                    bufferMaxElementCount = Math.Min(bufferMaxElementCount, GL.GetInteger(GetPName.MaxUniformBlockSize) / sizeof(float) / bufferElementSize);
                else
                    bufferMaxElementCount = GL.GetInteger(GetPName.MaxUniformBlockSize) / sizeof(float) / bufferElementSize;
            }
            else
            {
                if (bufferMaxElementCount > 0)
                    bufferMaxElementCount = Math.Min(bufferMaxElementCount, GL.GetInteger((GetPName)All.MaxShaderStorageBlockSize) / sizeof(float) / bufferElementSize);
                else
                    bufferMaxElementCount = GL.GetInteger((GetPName)All.MaxShaderStorageBlockSize) / sizeof(float) / bufferElementSize;
            }

            //if(bufferMaxElementCount < 0)
            //{
            //    if(shaderBufferType == ShaderBufferType.UBO)
            //        bufferMaxElementCount = GL.GetInteger(GetPName.MaxUniformBlockSize) / sizeof(float) / bufferElementSize;
            //    else
            //        bufferMaxElementCount = GL.GetInteger((GetPName)All.MaxShaderStorageBlockSize) / sizeof(float) / bufferElementSize;
            //}

            this.bufferMaxElementCount = bufferMaxElementCount;
            //this.bufferElementSize = bufferElementSize;

            this.nodeElementCount = TubeNode.Size / bufferElementSize;
            this.segmentElementCount = segmentElementCount;

            Utils.Assert(bufferMaxElementCount >= (nodeElementCount + segmentElementCount) * 2,
                        "bufferMaxElementCount >= (nodeElementCount + segmentElementCount) * 2");

            this.tubeCount = nodeCount.Length;

            var nodeCountCapacity = new int[tubeCount];

            this.cummNodeCount = new int[tubeCount + 1];
            this.nodeCount = new int[tubeCount];

            for (int i = 0; i < tubeCount; ++i)
            {
                Utils.Assert(nodeCount[i] > 1,
                            "nodeCount[i] > 1");

                cummNodeCount[i] = totalNodeCount;
                totalNodeCount += nodeCount[i];

                nodeCountCapacity[i] = nodeCount[i];
                this.nodeCount[i] = nodeCount[i];
            }

            cummNodeCount[tubeCount] = totalNodeCount;

            var totalNodeCountCapacity = totalNodeCount;

            var tubeId = 0;
            var bufferId = 0;

            var bufferCapacity = bufferMaxElementCount;
            var currSegmentCount = 0;
            var currNodeCount = 0;
            var maxBufferSize = 0;
            var dublicatedNode = false;

            while (totalNodeCountCapacity > 0)
            {
                var currNodeCountCapacity = nodeCountCapacity[tubeId];

                var firstNode = currNodeCountCapacity == nodeCount[tubeId];
                var lastNode = currNodeCountCapacity == 1;
                var secondlastNode = currNodeCountCapacity == 2;

                var currElementSize = nodeElementCount;
                var nextElementSize = nodeElementCount;

                if (!lastNode)
                    currElementSize += segmentElementCount;

                if (!secondlastNode)
                    nextElementSize += segmentElementCount;

                var currFits = bufferCapacity >= currElementSize;
                var nextFits = bufferCapacity >= currElementSize + nextElementSize;

                var addNewNode = currFits && (!firstNode || nextFits);

                if (addNewNode)
                {
                    bufferCapacity -= currElementSize;

                    if (nextFits || lastNode)
                    {
                        NodeMappingData mapping;
                        mapping.BufferId = bufferId;
                        mapping.Offset = currNodeCount * nodeElementCount;// not finalized
                        mapping.SegmentOffset = -1;
                        mapping.Dublicated = dublicatedNode;
                        mapping.EndNode = lastNode;
                        mapping.StartNode = firstNode;

                        idToMemMap.Add(mapping);

                        if (!lastNode)
                            ++currSegmentCount;

                        ++currNodeCount;

                        --totalNodeCountCapacity;
                        --nodeCountCapacity[tubeId];

                        if (lastNode) ++tubeId;

                        dublicatedNode = false;
                    }
                    else
                        dublicatedNode = true;
                }

                if (!addNewNode || totalNodeCountCapacity == 0)
                {
                    var bufferSize = bufferMaxElementCount - bufferCapacity;

                    Utils.Assert(bufferSize != 0,
                                "bufferSize != 0");

                    tubesBufferContent.Add(new ShaderBufferContent(bufferSize));
                    segmentCount.Add(currSegmentCount);

                    if (bufferSize > maxBufferSize) maxBufferSize = bufferSize;

                    bufferCapacity = bufferMaxElementCount;
                    currSegmentCount = 0;
                    currNodeCount = 0;

                    ++bufferId;
                }
            }

            shaderBufferCount = tubesBufferContent.Count;

            var bId = -1;
            var bOff = 0;
            var addOffset = 0;
            for (var nId = 0; nId < totalNodeCount; ++nId)
            {
                var mapping = idToMemMap[nId];

                if (mapping.BufferId > bId)
                {
                    bId = mapping.BufferId;
                    bOff = 0;

                    addOffset = segmentCount[bId] * segmentElementCount;
                }

                mapping.Offset += addOffset;
                mapping.SegmentOffset = bOff;

                idToMemMap[nId] = mapping;

                if (!mapping.EndNode)
                {
                    tubesBufferContent[bId].Fill(bOff, 0, (float)mapping.Offset);

                    bOff += segmentElementCount;
                }
            }

            shaderBuffer = new ShaderBuffer(shaderBufferType, maxBufferSize, bufferUsageHintType);
        }
コード例 #4
0
ファイル: Shader.cs プロジェクト: TinyTexel/SplineTubes
        public void BindShaderBuffer(ShaderBuffer buffer, string uniformBlockName)
        {
            var binding = new ShaderBufferBinding()
            {
                Buffer = buffer,
                BlockName = uniformBlockName,
            };

            shaderBufferBindings.Add(binding);

            rebindShaderBufferBinding(binding);
        }
コード例 #5
0
ファイル: BKP.cs プロジェクト: TinyTexel/SplineTubes
        protected override void OnLoad(EventArgs e)
        {
            GL.ClearColor(Color4.Brown);

            GL.Enable(EnableCap.DepthTest);
            GL.DepthFunc(DepthFunction.Less);

            //GL.Enable(EnableCap.CullFace);
            //GL.CullFace(CullFaceMode.Back);

            vertexBuffer = new VertexBuffer<Vector3>
            (
                new Vector3(-1f, +1f, +1f),
                new Vector3(-1f, -1f, +1f),
                new Vector3(+1f, +1f, +1f),
                new Vector3(+1f, -1f, +1f),
                new Vector3(+1f, -1f, -1f),
                new Vector3(+1f, +1f, -1f),
                new Vector3(-1f, +1f, -1f),
                new Vector3(-1f, -1f, -1f)
            );

            //indexBuffer = new IndexBuffer
            //(
            //    0, 1, 3, 2,
            //    2, 3, 4, 5,
            //    5, 4, 7, 6,
            //    6, 7, 1, 0,
            //    0, 2, 5, 6,
            //    1, 7, 4, 3
            //);

            indexBuffer = IndexBuffer.CreateQuadCylinder(8, 16);

            string shaderPath = projectPath + "TessTriCube";
            string shaderPath2 = projectPath + "TessQuadCube";
            string shaderPath3 = projectPath + "TessCyl";

            shader = new Shader(
            new Shader.Desc(ShaderType.VertexShader, shaderPath3 + ".vs"),
            new Shader.Desc(ShaderType.TessControlShader, shaderPath2 + ".tc"),
                //new Shader.Desc(ShaderType.TessControlShader, shaderPath + ".tc"),
            new Shader.Desc(ShaderType.TessEvaluationShader, shaderPath3 + ".te"),
                //new Shader.Desc(ShaderType.TessEvaluationShader, shaderPath + ".te"),
            new Shader.Desc(ShaderType.FragmentShader, shaderPath + ".ps"));

            shader.Bind();

            //uniformScale = GL.GetUniformLocation(shaderProgramHandle, "scale");
            //uniformMatViewProj = GL.GetUniformLocation(shader.Handle, "viewProjMat");

            ubuffer = new ShaderBuffer(ShaderBufferType.UBO, 4, BufferUsageHint.StreamDraw);
            ubuffer.BindToIndex(0);
            //ubuffer.BindToProgram(shader.Handle, "shader_data");
            shader.BindShaderBuffer(ubuffer, "shader_data");

            query = new PerfQuery();

            projMat = Matrix4.CreatePerspectiveFieldOfView((float)Math.PI * 0.25f, Width / (float)Height, 1f, 5000f);
        }