Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OpenGL纹理渲染-仅显示左上角像素_C#_Opengl_Opentk - Fatal编程技术网

C# OpenGL纹理渲染-仅显示左上角像素

C# OpenGL纹理渲染-仅显示左上角像素,c#,opengl,opentk,C#,Opengl,Opentk,我与C#和OpenTK一起工作。 目前我只想映射三角形上的纹理。 它似乎可以工作,但在最近的纹理过滤器上,整个三角形仅使用bmp图像的左上角像素颜色进行着色,如果我将纹理过滤器设置为线性,三角形仍然只显示一种颜色,但它现在是否与其他像素混合。 有人能在代码中找到错误吗 protected override void OnLoad(EventArgs e) { base.OnLoad(e); GL.Enable(EnableCap.

我与C#和OpenTK一起工作。 目前我只想映射三角形上的纹理。 它似乎可以工作,但在最近的纹理过滤器上,整个三角形仅使用bmp图像的左上角像素颜色进行着色,如果我将纹理过滤器设置为线性,三角形仍然只显示一种颜色,但它现在是否与其他像素混合。 有人能在代码中找到错误吗

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

            GL.Enable(EnableCap.Texture2D);
            GL.ClearColor(0.5F, 0.5F, 0.5F, 1.0F);

            int vertexShaderHandle = GL.CreateShader(ShaderType.VertexShader);
            int fragmentShaderHandle = GL.CreateShader(ShaderType.FragmentShader);

            string vertexShaderSource = @"#version 400
                                            layout(location = 0) in vec3 position;
                                            layout(location = 1) in vec2 uv;
                                            out vec2 texture_uv;
                                            void main()
                                            {
                                                gl_Position = vec4(inPosition.xyz, 1);
                                                texture_uv = uv;
                                            }";
            string fragmentShaderSource = @"#version 400
                                            in vec2 texture_uv;
                                            out vec3 outColor;
                                            uniform sampler2D uniSampler;
                                            void main()
                                            {
                                                outColor = texture( uniSampler, texture_uv ).rgb;
                                            }";

            GL.ShaderSource(vertexShaderHandle, vertexShaderSource);
            GL.ShaderSource(fragmentShaderHandle, fragmentShaderSource);

            GL.CompileShader(vertexShaderHandle);
            GL.CompileShader(fragmentShaderHandle);

            prgHandle = GL.CreateProgram();
            GL.AttachShader(prgHandle, vertexShaderHandle);
            GL.AttachShader(prgHandle, fragmentShaderHandle);
            GL.LinkProgram(prgHandle);

            GL.DetachShader(prgHandle, vertexShaderHandle);
            GL.DetachShader(prgHandle, fragmentShaderHandle);
            GL.DeleteShader(vertexShaderHandle);
            GL.DeleteShader(fragmentShaderHandle);

            uniSamplerLoc = GL.GetUniformLocation(prgHandle, "uniSampler");

            texHandle = GL.GenTexture();
            GL.BindTexture(TextureTarget.Texture2D, texHandle);
            Bitmap bmp = new Bitmap("C:/Users/Michael/Desktop/Test.bmp");
            BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

            GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, bmpData.Width, bmpData.Height, 0,
            OpenTK.Graphics.OpenGL4.PixelFormat.Bgra, PixelType.UnsignedByte, bmpData.Scan0);

            bmp.UnlockBits(bmpData);

            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest);

            vaoHandle = GL.GenVertexArray();
            GL.BindVertexArray(vaoHandle);

            vboHandle = GL.GenBuffer();
            GL.BindBuffer(BufferTarget.ArrayBuffer, vboHandle);
            float[] bufferData = {  0.5F, 1, 0, 1, 1, 
                                    0, 0, 0, 0, 0, 
                                    1, 0, 0, 1, 0 };
            GL.BufferData<float>(BufferTarget.ArrayBuffer, (IntPtr) (15 * sizeof(float)), bufferData, BufferUsageHint.StaticDraw);

            GL.EnableVertexAttribArray(0);
            GL.EnableVertexAttribArray(1);
            GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 5 * sizeof(float), 0);
            GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, false, 5 * sizeof(float), 3 * sizeof(float));
        }
        protected override void OnUnload(EventArgs e)
        {
            base.OnUnload(e);

            GL.DeleteTexture(texHandle);
            GL.DeleteProgram(prgHandle);
            GL.DeleteBuffer(vboHandle);
            GL.DeleteVertexArray(vaoHandle);
        }
        protected override void OnRenderFrame(FrameEventArgs e)
        {
            base.OnRenderFrame(e);

            GL.Clear(ClearBufferMask.ColorBufferBit);
            GL.UseProgram(prgHandle);
            GL.Uniform1(uniSamplerLoc, texHandle);
            GL.BindVertexArray(vaoHandle);
            GL.DrawArrays(PrimitiveType.Triangles, 0, 3);

            SwapBuffers();
        }

但是没有改变:(

采样器统一变量的值需要是它应该从中采样的纹理单位。在代码中,它被设置为纹理名称(又名纹理id,又名纹理句柄):

可以使用
ActiveTexture()
设置纹理单位。调用
glBindTexture()
时,当前活动纹理单位的值确定纹理绑定到哪个单位。活动纹理单位的默认值为0。因此,如果从未调用
ActiveTexture()
,则制服应设置为:

GL.Uniform1(uniSamplerLoc, 0);
正如前面提到的,另一个相关的错误源是统一的值是基于0的纹理单元索引,而
glActiveTexture()
调用使用以
GL\u TEXTURE0
开头的枚举。例如,使用C绑定(不确定这在C和OpenTK中看起来如何,但应该足够相似),这会将纹理绑定到纹理单元3,并设置统一采样器变量以使用它:

glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_2D, texId);
glUniform1i(texUniformLoc, 3);

请注意
glu TEXTURE3
如何在
glActiveTexture()
的参数中使用,但是
glUniform1i()
中的一个普通
3
,不幸的是,它没有改变任何内容:(
GL.Uniform1(uniSamplerLoc, 0);
glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_2D, texId);
glUniform1i(texUniformLoc, 3);