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
Can';t在glTexSubImage2D中指定大小_C_Opengl_Texture Mapping - Fatal编程技术网

Can';t在glTexSubImage2D中指定大小

Can';t在glTexSubImage2D中指定大小,c,opengl,texture-mapping,C,Opengl,Texture Mapping,我正在尝试在已应用于2D四边形的纹理上创建一个子纹理。当通过默认参数(宽度和高度)时,它工作正常,但当我输入整数大小(例如宽度为100,高度为100)时,输出不正确。扫描线显示在干燥区域。这是密码 unsigned char* grass_image = SOIL_load_image("grass1.jpg", &width, &height, 0, SOIL_LOAD_RGB); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, h

我正在尝试在已应用于2D四边形的纹理上创建一个子纹理。当通过默认参数(宽度和高度)时,它工作正常,但当我输入整数大小(例如宽度为100,高度为100)时,输出不正确。扫描线显示在干燥区域。这是密码

unsigned char* grass_image = SOIL_load_image("grass1.jpg", &width, &height, 0, SOIL_LOAD_RGB);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB,GL_UNSIGNED_BYTE, grass_image);

SOIL_free_image_data(grass_image);

unsigned char* temple_image = SOIL_load_image("temple.jpg", &width, &height, 0, SOIL_LOAD_RGB);

glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height,
    GL_RGB,GL_UNSIGNED_BYTE, temple_image); // NO ERROR

glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 100, 100,
    GL_RGB,GL_UNSIGNED_BYTE, temple_image); // ERROR

SOIL_free_image_data(temple_image);

问题是您需要设置步幅,现在子图像中的第二行像素将是原始图像中第一行像素的像素101-200

您需要使用
glPixelStorei(GL\u UNPACK\u ROW\u LENGTH,stride)设置步幅像这样:

unsigned char* temple_image = SOIL_load_image("temple.jpg", &width, &height, 0, SOIL_LOAD_RGB);
glPixelStorei(GL_UNPACK_ROW_LENGTH, width);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 100, 100,
    GL_RGB,GL_UNSIGNED_BYTE, temple_image);

嗯,用不同于实际大小的大小解释图像数据会使它看起来很奇怪。此外,如果我将其映射到比其原始大小更小的大小,则这应该不是问题。如果我错了,请纠正我。OpenGL使用宽度参数确定行的长度。如果指定的宽度小于图像的实际宽度,则扫描线不匹配,将产生一个奇怪的图像。添加该行后,仅显示图像的一部分。如果图像是400X400,并且我已通过100作为宽度和高度值,则仅显示左上角的四分之一。而我希望整个400X400图像映射到100X100。有什么办法吗???@MohitJain你必须自己调整大小。正如上校所说,你必须自己调整大小,OpenGL不适合你。