C# OpenGL中对正方形应用纹理的问题
我被困在无法将纹理映射到openGLES中的正方形上。我试图在屏幕上显示一个jpg图像,为了做到这一点,我画了一个正方形,然后将图像映射到上面。然而,作为一个输出,我得到的只是一个白色的正方形。我不知道我做错了什么。这个问题阻碍了我继续我的项目。我正在使用Windows Mobile。 我验证了纹理是否正确加载,但无法将其应用于我的对象。我上传了显示我的问题的示例项目。您需要VS2008和Windows Mobile 6 SDK才能运行它。我还在这里发布了渲染和纹理对象的表单代码。任何建议都将不胜感激,因为我已经被这个问题困扰了一段时间,我不知道我做错了什么C# OpenGL中对正方形应用纹理的问题,c#,.net,windows-mobile,opengl-es,C#,.net,Windows Mobile,Opengl Es,我被困在无法将纹理映射到openGLES中的正方形上。我试图在屏幕上显示一个jpg图像,为了做到这一点,我画了一个正方形,然后将图像映射到上面。然而,作为一个输出,我得到的只是一个白色的正方形。我不知道我做错了什么。这个问题阻碍了我继续我的项目。我正在使用Windows Mobile。 我验证了纹理是否正确加载,但无法将其应用于我的对象。我上传了显示我的问题的示例项目。您需要VS2008和Windows Mobile 6 SDK才能运行它。我还在这里发布了渲染和纹理对象的表单代码。任何建议都将不
public partial class Form1 : Form
{
[DllImport("coredll")]
extern static IntPtr GetDC(IntPtr hwnd);
EGLDisplay myDisplay;
EGLSurface mySurface;
EGLContext myContext;
public Form1()
{
InitializeComponent();
myDisplay = egl.GetDisplay(new EGLNativeDisplayType(this));
int major, minor;
egl.Initialize(myDisplay, out major, out minor);
EGLConfig[] configs = new EGLConfig[10];
int[] attribList = new int[]
{
egl.EGL_RED_SIZE, 5,
egl.EGL_GREEN_SIZE, 6,
egl.EGL_BLUE_SIZE, 5,
egl.EGL_DEPTH_SIZE, 16 ,
egl.EGL_SURFACE_TYPE, egl.EGL_WINDOW_BIT,
egl.EGL_STENCIL_SIZE, egl.EGL_DONT_CARE,
egl.EGL_NONE, egl.EGL_NONE
};
int numConfig;
if (!egl.ChooseConfig(myDisplay, attribList, configs, configs.Length, out numConfig) || numConfig < 1)
throw new InvalidOperationException("Unable to choose config.");
EGLConfig config = configs[0];
mySurface = egl.CreateWindowSurface(myDisplay, config, Handle, null);
myContext = egl.CreateContext(myDisplay, config, EGLContext.None, null);
egl.MakeCurrent(myDisplay, mySurface, mySurface, myContext);
gl.ClearColor(0, 0, 0, 0);
InitGL();
}
void InitGL()
{
gl.ShadeModel(gl.GL_SMOOTH);
gl.ClearColor(0.0f, 0.0f, 0.0f, 0.5f);
gl.BlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA);
gl.Hint(gl.GL_PERSPECTIVE_CORRECTION_HINT, gl.GL_NICEST);
}
public unsafe void DrawGLScene()
{
gl.MatrixMode(gl.GL_PROJECTION);
gl.LoadIdentity();
gl.Orthof(0, ClientSize.Width, ClientSize.Height, 0, 0, 1);
gl.Disable(gl.GL_DEPTH_TEST);
gl.MatrixMode(gl.GL_MODELVIEW);
gl.LoadIdentity();
Texture myImage;
Bitmap Image = new Bitmap(@"\Storage Card\Texture.jpg");
using (MemoryStream ms = new MemoryStream())
{
Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
myImage = Texture.LoadStream(ms, false);
}
float[] rectangle = new float[] {
0, 0,
myImage.Width, 0,
0, myImage.Height,
myImage.Width, myImage.Height
};
float[] texturePosition = new float[] {
0, 0,
myImage.Width, 0,
0, myImage.Height,
myImage.Width, myImage.Height
};
//Bind texture
gl.BindTexture(gl.GL_TEXTURE_2D, myImage.Name);
gl.TexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR);
gl.TexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR);
gl.EnableClientState(gl.GL_TEXTURE_COORD_ARRAY);
gl.EnableClientState(gl.GL_VERTEX_ARRAY);
//draw square and texture it.
fixed (float* rectanglePointer = &rectangle[0], positionPointer = &texturePosition[0])
{
gl.TexCoordPointer(2, gl.GL_FLOAT, 0, (IntPtr)positionPointer);
gl.VertexPointer(2, gl.GL_FLOAT, 0, (IntPtr)rectanglePointer);
gl.DrawArrays(gl.GL_TRIANGLE_STRIP, 0, 4);
}
gl.DisableClientState(gl.GL_TEXTURE_COORD_ARRAY);
gl.DisableClientState(gl.GL_VERTEX_ARRAY);
}
protected override void OnPaintBackground(PaintEventArgs e)
{
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
gl.Clear(gl.GL_COLOR_BUFFER_BIT);
DrawGLScene();
egl.SwapBuffers(myDisplay, mySurface);
gl.Clear(gl.GL_COLOR_BUFFER_BIT);
}
protected override void OnClosing(CancelEventArgs e)
{
if (!egl.DestroySurface(myDisplay, mySurface))
throw new Exception("Error while destroying surface.");
if (!egl.DestroyContext(myDisplay, myContext))
throw new Exception("Error while destroying context.");
if (!egl.Terminate(myDisplay))
throw new Exception("Error while terminating display.");
base.OnClosing(e);
}
}
公共部分类表单1:表单
{
[DllImport(“coredll”)]
外部静态IntPtr GetDC(IntPtr hwnd);
电子显示屏;
EGLSurface-mySurface;
EGLContext-myContext;
公共表格1()
{
初始化组件();
myDisplay=egl.GetDisplay(新的EGLNativeDisplayType(this));
int大调、小调;
egl.初始化(myDisplay、out major、out minor);
EGLConfig[]configs=新的EGLConfig[10];
int[]属性列表=新int[]
{
egl.egl_红色_尺寸,5,
egl.egl_绿色_尺寸,6,
egl.egl_蓝色_尺寸,5,
egl.egl_深度_尺寸,16,
egl.egl_表面类型,egl.egl_窗口位,
egl.egl_模板尺寸,egl.egl_不在乎,
egl.egl_无,egl.egl_无
};
int numConfig;
如果(!egl.ChooseConfig(myDisplay,attribList,configs,configs.Length,out numConfig)| | numConfig<1)
抛出新的InvalidOperationException(“无法选择配置”);
EGLConfig config=configs[0];
mySurface=egl.createWindowsSurface(myDisplay,config,Handle,null);
myContext=egl.CreateContext(myDisplay,config,EGLContext.None,null);
例如MakeCurrent(myDisplay、mySurface、mySurface、myContext);
gl.ClearColor(0,0,0,0);
InitGL();
}
void InitGL()
{
gl.ShadeModel(gl.gl\u平滑);
gl.ClearColor(0.0f、0.0f、0.0f、0.5f);
gl.BlendFunc(gl.gl_SRC_ALPHA,gl.gl_ONE_减去SRC_ALPHA);
总账提示(总账透视图、更正提示、总账最佳);
}
公共不安全的无效场景()
{
gl.矩阵模式(gl.gl_投影);
gl.LoadIdentity();
gl.Orthof(0,ClientSize.Width,ClientSize.Height,0,0,1);
gl.Disable(gl.gl\U深度\U测试);
gl.MatrixMode(gl.gl\U模型视图);
gl.LoadIdentity();
纹理图像;
位图图像=新位图(@“\Storage Card\Texture.jpg”);
使用(MemoryStream ms=new MemoryStream())
{
保存(ms,System.Drawing.Imaging.ImageFormat.Bmp);
myImage=Texture.LoadStream(ms,false);
}
浮动[]矩形=新浮动[]{
0, 0,
myImage.Width,0,
0,myImage.Height,
myImage.Width,myImage.Height
};
浮点[]纹理位置=新浮点[]{
0, 0,
myImage.Width,0,
0,myImage.Height,
myImage.Width,myImage.Height
};
//绑定纹理
gl.BindTexture(gl.gl\u TEXTURE\u 2D,myImage.Name);
gl.TexParameteri(gl.gl\u纹理\u 2D、gl.gl\u纹理\u最小\u过滤器、gl.gl\u线性);
gl.TexParameteri(gl.gl\u纹理\u 2D、gl.gl\u纹理\u MAG\u过滤器、gl.gl\u线性);
gl.EnableClientState(gl.gl\u纹理\u坐标\u数组);
gl.EnableClientState(gl.gl\u顶点\u数组);
//画正方形并对其进行纹理处理。
已修复(浮点*矩形指针=&矩形[0],位置指针=&纹理位置[0])
{
gl.TexCoordPointer(2,gl.gl_浮点,0,(IntPtr)位置指针);
gl.VERTEXPINTER(2,gl.gl_浮点,0,(IntPtr)矩形指针);
gl.DrawArray(gl.gl_三角形_带,0,4);
}
gl.DisableClientState(gl.gl\u纹理\u坐标\u数组);
gl.DisableClientState(gl.gl\u顶点\u数组);
}
PaintBackground上受保护的覆盖无效(PaintEventArgs e)
{
}
受保护的覆盖无效OnPaint(PaintEventArgs e)
{
基础漆(e);
gl.Clear(gl.gl\U颜色\U缓冲\U位);
DrawGLScene();
例如SwapBuffers(myDisplay,mySurface);
gl.Clear(gl.gl\U颜色\U缓冲\U位);
}
关闭时受保护的覆盖无效(CancelEventArgs e)
{
如果(!egl.DestroySurface(myDisplay,mySurface))
抛出新异常(“销毁表面时出错”);
如果(!egl.DestroyContext(myDisplay,myContext))
抛出新异常(“销毁上下文时出错”);
如果(!egl.终止(myDisplay))
抛出新异常(“终止显示时出错”);
基数(e);
}
}
您需要启用纹理:
glEnable( GL_TEXTURE_2D );
渲染正方形之前。需要启用纹理:
glEnable( GL_TEXTURE_2D );
在渲染正方形之前。谢谢您的帮助!然而,你的建议并没有解决这个问题。现在正方形是黑色而不是白色,但仍然没有纹理。我尝试在每个可能的位置添加gl.Enable(gl.gl\u TEXTURE\u 2D),但结果仍然是黑色正方形 编辑: 对不起,我的照片左上角是黑色的,所以我什么都没看到。将图像更改为具有不同的颜色,现在我可以看到渲染的部分图像。它没有正确的映射,但我能找到那部分。
谢谢你们的帮助 谢谢你的帮助!然而,你的建议并没有解决这个问题。现在正方形是黑色而不是白色,但仍然没有纹理。我尝试在每个可能的位置添加gl.Enable(gl.gl\u TEXTURE\u 2D),但结果仍然是黑色正方形 编辑: 对不起,我的图片左上角是bla