在Windows窗体中使用SimpleOpenGLControl组件, 例如,我想画一条线。或任何其他无纹理的东西。 使用glcolor3b,3ub,3d,3f函数,他们的模拟有4个参数 - 没有任何反应。颜色保持不变,我无法管理这种颜色。在一个项目中它就像绿色,其他像浅灰色。 现在我知道问题出在我的Background类中,方法是LoadTextureForModel:
public class Background : Visible
{
public Background(string Path)
{
LoadTextureForModel(Path);
}
public override void Display()
{
MyGlutUser.DrawRect((int)TextureObj(), new FPoint(0, 0),
MyGlutUser.WorldW + 100, MyGlutUser.WorldH + 100);
}
}
public abstract class Visible
{
public abstract void Display();
public String PathToImage
{ get; set; }
public RGBubColor Color
{ get; set; }
protected int imageID;
public int ImageID
{
get
{
return imageID;
}
set
{
imageID = value;
}
}
protected int mGlTextureObject { get; set; }
public FPoint Location
{ get; set; }
public static int Counter = 0;
public int TextureObj()
{
return mGlTextureObject;
}
public void LoadTextureForModel(string FileName)
{
PathToImage = FileName;
Il.ilGenImages(1, out imageID);
Il.ilBindImage(imageID);
if (Il.ilLoadImage(PathToImage))
{
int width = Il.ilGetInteger(Il.IL_IMAGE_WIDTH);
int height = Il.ilGetInteger(Il.IL_IMAGE_HEIGHT);
int bitspp = Il.ilGetInteger(Il.IL_IMAGE_BITS_PER_PIXEL);
switch (bitspp) // в зависимости оп полученного результата
{
case 24:
mGlTextureObject = MakeGlTexture(Gl.GL_RGB, Il.ilGetData(), width, height);
break;
case 32:
mGlTextureObject = MakeGlTexture(Gl.GL_RGBA, Il.ilGetData(), width, height);
break;
}
Il.ilDeleteImages(1, ref imageID);
}
}
绘制线条的代码:
public static void DrawLine(FPoint p1, FPoint p2)
{
Gl.glBegin(Gl.GL_LINES);
Gl.glVertex2d(p1.x, p1.y);
Gl.glVertex2d(p2.x, p2.y);
Gl.glEnd();
}
public static void DrawLine(RGBubColor Color, FPoint p1, FPoint p2)
{
Gl.glColor3d((double)Color.r / 255.0, (double)Color.g / 255.0, (double)Color.b / 255.0);
DrawLine(p1, p2);
}
public struct RGBubColor
{
public byte r; public byte g; public byte b;
public RGBubColor(byte r, byte g, byte b)
{
this.r = r;
this.g = g;
this.b = b;
}
};
Invokation:
GlutUser.DrawLine(new RGBubColor(127, 0, 0), 5, new FPoint(0, 0), new FPoint(500, 500));
我需要一种方法来修复我的LoadTextureForModel函数。
答案 0 :(得分:0)
尝试使用此代码清洁颜色和矩阵状态:
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
Gl.glLoadIdentity();
Gl.glPushMatrix();
Gl.glTranslated(a, b, c);
Gl.glScaled(zoom, zoom, zoom);
---------------
drawing code
---------------
Gl.glPopMatrix();
Gl.glFlush();
和
Gl.glClearColor(clearR / 255f, clearG / 255f, clearB / 255f, 1);
对我有用
修改强>
下面有一些工作代码可以修复我认为的错误。
<强> EXAMPLE: 强>
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
Gl.glLoadIdentity();
Gl.glColor3f(255, 0, 0);
Gl.glBegin(Gl.GL_LINE_LOOP);
Gl.glVertex2d(8, 7);
Gl.glVertex2d(15, 27);
Gl.glVertex2d(17, 27);
Gl.glVertex2d(23, 7);
Gl.glVertex2d(21, 7);
Gl.glVertex2d(19, 14);
Gl.glVertex2d(12.5, 14);
Gl.glVertex2d(10, 7);
Gl.glEnd();
Gl.glBegin(Gl.GL_LINE_LOOP);
Gl.glColor3f(0, 255, 0);
Gl.glVertex2d(18.5, 16);
Gl.glVertex2d(16, 25);
Gl.glVertex2d(13.2, 16);
Gl.glEnd();
Gl.glFlush();
(您将找到的完整版代码here)
你会得到像
这样的东西答案 1 :(得分:0)
要回答编辑无效的原因:
你应该只打电话
Gl.glClear(GL_COLOR_BUFFER_BIT);
Gl.glLoadIdentity();
每次循环运行一次,除非您明确要重置颜色或视图矩阵(在大多数情况下您不需要)。
同样如此
Gl.glFlush();
通常只需要在主绘图循环结束时调用。
这意味着您的DrawLines函数应该类似于:
public static void DrawLine(FPoint p1, FPoint p2)
{
Gl.glPushMatrix();
Gl.glBegin(Gl.GL_LINES);
Gl.glVertex2d(p1.x, p1.y);
Gl.glVertex2d(p2.x, p2.y);
Gl.glEnd();
Gl.glPopMatrix();
}
您的主循环应该类似于:
//Loop Start
GL.glClear(GL_COLOR_BUFFER_BIT);
GL.glLoadIdentity();
//Tranformation code here.
Gl.glColor3f(0, 255, 0);
DrawLine(p1,p2);
//Any other drawing code.
Gl.glFlush();
//End Loop
希望这有帮助。