OpenGL纹理+闪电+混合麻烦

时间:2014-11-19 13:56:27

标签: c# opengl opentk

我正在使用OpenTK,我很难理解openGL启用功能的概念。 透视矩阵在onResize函数中。

我正在尝试显示纹理。

我的渲染功能:

        GL.ClearColor(0.5f, 0.5f, 0.5f, 1.0f); 
        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
        GL.MatrixMode(MatrixMode.Modelview);
        GL.LoadIdentity();
        GL.Enable(EnableCap.Texture2D);
        GL.Enable(EnableCap.DepthTest);
        Ground.Draw();

My Ground.Draw()函数(sizeXZ.Z,sizeXZ.Y是常量):

        GL.PushMatrix();
        GL.Translate(new Vector3(-sizeXZ.X / 2, -1, sizeXZ.Y / 2));
        GL.BindTexture(TextureTarget.Texture2D, Textures.GetTextureId(textureName));
        GL.Begin(PrimitiveType.Quads);
        GL.Color3(1,1,1);
        GL.Normal3(0, 1, 0);
        GL.TexCoord2(1f, 1f); GL.Vertex3(0, 0, 0);
        GL.TexCoord2(1f, 0f); GL.Vertex3(sizeXZ.X, 0, 0);
        GL.TexCoord2(0f, 0f); GL.Vertex3(sizeXZ.X, 0, -sizeXZ.Y);
        GL.TexCoord2(0f, 1f); GL.Vertex3(0, 0, -sizeXZ.Y);
        GL.End();
        GL.PopMatrix();

它显示黑色非纹理四边形。当我添加一些光时,纹理会出现,但会消失一些四边形的颜色:

GL.BindTexture(TextureTarget.Texture2D, Textures.GetTextureId(textureName));
GL.Begin(PrimitiveType.Quads);
GL.Normal3(0, 0, 1);
if (true) GL.Color4(0,1,0,1); // it appears to be the background color, not green
if (false) GL.TexCoord2(1f, 0f); GL.Vertex3(0, 0, 0);
if (false) GL.TexCoord2(1f, 1f); GL.Vertex3(3f, 0, 0);
if (false) GL.TexCoord2(0f, 1f); GL.Vertex3(3f, 3f, 0);
if (false) GL.TexCoord2(0f, 0f); GL.Vertex3(0, 3f, 0);
GL.Color4(1, 1, 1, 1);
GL.End();

1 个答案:

答案 0 :(得分:5)

您的计划有两个问题:

<强> 1。使用Color3

查看OpenTK Color3文档,您会注意到此函数有两个重载:

Color3  (Double red, Double green, Double blue)
Color3  (SByte red, SByte green, SByte blue)

GL.Color3(1,1,1)给你一个黑色物体的原因是,它使用了SByte版本,其中假设值在[0,255]范围内。因此1很暗。请注意,GL.Color3(1.0,1.0,1.0)调用Double重载。

<强> 2。 GL_TEXTURE_ENV_MODE

默认情况下,它设置为GL_MODULATE,它将纹理颜色与顶点颜色相乘。与1.一起,这使你的纹理消失。有关详细信息,请参阅here