这是我的确切代码的简化版本,
我期待看到所有的红色(因为我只将红色设置为255,其他设置为0),但实际上得到了这个:
#include <GLUT/glut.h>
static GLuint texture;
void reshape(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2, 2, -2, 2, -2, 2);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
static void callback(unsigned char *data, long width, long height) {
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
//glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
int i,j;
for (i = 0; i < height; i++) {
for (j = 0; j < width; j++) {
data[i * 3 * width + 3 * j] = 255;
data[i * 3 * width + 3 * j + 1] = 0;
data[i * 3 * width + 3 * j + 2] = 0;
}
}
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glBindTexture(GL_TEXTURE_2D, 0);
}
void init() {
glClearColor(0, 0, 0, 0);//RGBA
}
void display() {
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
unsigned char data[3 * 350 * 168];
callback(data, 350, 168);
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);glVertex2f(-2, -2);
glTexCoord2f(0, 1);glVertex2f(-2, 2);
glTexCoord2f(1, 1);glVertex2f(2, 2);
glTexCoord2f(1, 0);glVertex2f(2, -2);
glEnd();
glBindTexture(GL_TEXTURE_2D, 0);
glutSwapBuffers();
}
int main(int argc, char *argv[]) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH|GLUT_RGBA);
glutInitWindowSize(512, 512);
glutInitWindowPosition(100, 100);
glutCreateWindow("hello world texture window");
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutIdleFunc(display);
init();
glutMainLoop();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
Run Code Online (Sandbox Code Playgroud)
这是你的问题.这是一个常见但微妙的错误.
你告诉OpenGL你将提供三个组件的颜色数据:R,G和B.你说每个组件都是一个UNSIGNED_BYTE
大小.
但你也告诉OpenGL其他东西.函数调用中未提及的内容.即,各行像素数据的对齐.默认行对齐为4.这意味着OpenGL将假设每行的字节宽度将填充为四个字节.
这一点尤为重要,因为行宽为350.每像素350*3字节为1050字节.哪个不能被四个整除.这意味着OpenGL将假定每行占用1052个字节.因此颜色搞砸了; 这就是模式重复的原因.这也是你在右上方获得垃圾像素的原因(因为OpenGL将第一行放在底部,它从内存中读取前几个像素的垃圾).
每当上传像素数据时,您都需要设置对齐(主要是为了确保将其设置为您需要的对齐).这是通过glPixelStorei完成的:
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
Run Code Online (Sandbox Code Playgroud)
这会将行对齐设置为1.实际上,它是未对齐的.
或者,您只需上传GL_RGBA数据,该数据始终为4字节对齐.那你就不用担心了.
归档时间: |
|
查看次数: |
84 次 |
最近记录: |