- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在重写我的纹理代码的很大一部分。我希望能够指定某些内部格式:GL_RGB8I、GL_RGB8UI、GL_RGB16I、GL_RGB16UI、GL_RGB32I 和 GL_RGB32UI。这些 token 在 OpenGL 2 中不存在。
将这些内部格式指定为 glTexImage2D 的参数时,纹理会失败(纹理显示为白色)。检查错误时,我得到 [EDIT:] 1282(“无效操作”)。我认为这意味着 OpenGL 仍在将 OpenGL 2 用于 glTexImage2D,因此调用失败。显然,它需要使用更新的版本才能成功。像 GL_RGB、GL_RGBA 和(奇怪的)GL_RGB32F、GL_RGBA32F 之类的枚举按预期工作。
我配置为使用 GLEW 或 Glee 进行扩展。我可以在其他地方毫无问题地使用 OpenGL 4 调用(例如,glPatchParameteri、glBindFramebuffer 等),并且有问题的枚举肯定存在。为完整起见,glGetString(GL_VERSION) 返回“4.2.0”。我的问题:我可以强制这些扩展库之一使用 OpenGL 4.2 版本吗?如果是这样,如何?
编辑:代码太复杂,无法发布,但这里有一个简单的、自包含的示例,使用 GLee 也演示了问题:
#include <GLee5_4/GLee.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <gl/glut.h>
//For Windows
#pragma comment(lib,"GLee.lib")
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glu32.lib")
#pragma comment(lib,"glut32.lib")
#include <stdlib.h>
#include <stdio.h>
const int screen_size[2] = {512,512};
#define TEXTURE_SIZE 64
//Choose a selection. If you see black, then texturing is working. If you see red, then the quad isn't drawing. If you see white, texturing has failed.
#define TYPE 1
void error_check(void) {
GLenum error_code = glGetError();
const GLubyte* error_string = gluErrorString(error_code);
(error_string==NULL) ? printf("%d = (unrecognized error--an extension error?)\n",error_code) : printf("%d = \"%s\"\n",error_code,error_string);
}
#if TYPE==1 //############ 8-BIT TESTS ############
inline GLenum get_type(int which) { return (which==1)? GL_RGB8: GL_RGB; } //works
#elif TYPE==2
inline GLenum get_type(int which) { return (which==1)? GL_RGBA8:GL_RGBA; } //works
#elif TYPE==3
inline GLenum get_type(int which) { return (which==1)? GL_RGB8UI: GL_RGB; } //doesn't work (invalid op)
#elif TYPE==4
inline GLenum get_type(int which) { return (which==1)? GL_RGB8I: GL_RGB; } //doesn't work (invalid op)
#elif TYPE==5
inline GLenum get_type(int which) { return (which==1)? GL_RGBA8UI:GL_RGBA; } //doesn't work (invalid op)
#elif TYPE==6
inline GLenum get_type(int which) { return (which==1)? GL_RGBA8I:GL_RGBA; } //doesn't work (invalid op)
#elif TYPE==7 //############ 16-BIT TESTS ############
inline GLenum get_type(int which) { return (which==1)? GL_RGB16: GL_RGB; } //works
#elif TYPE==8
inline GLenum get_type(int which) { return (which==1)? GL_RGBA16:GL_RGBA; } //works
#elif TYPE==9
inline GLenum get_type(int which) { return (which==1)? GL_RGB16UI: GL_RGB; } //doesn't work (invalid op)
#elif TYPE==10
inline GLenum get_type(int which) { return (which==1)? GL_RGB16I: GL_RGB; } //doesn't work (invalid op)
#elif TYPE==11
inline GLenum get_type(int which) { return (which==1)?GL_RGBA16UI:GL_RGBA; } //doesn't work (invalid op)
#elif TYPE==12
inline GLenum get_type(int which) { return (which==1)? GL_RGBA16I:GL_RGBA; } //doesn't work (invalid op)
#elif TYPE==13 //############ 32-BIT TESTS ############
inline GLenum get_type(int which) { return (which==1)? GL_RGB32: GL_RGB; } //token doesn't exist
#elif TYPE==14
inline GLenum get_type(int which) { return (which==1)? GL_RGBA32:GL_RGBA; } //token doesn't exist
#elif TYPE==15
inline GLenum get_type(int which) { return (which==1)? GL_RGB32UI: GL_RGB; } //doesn't work (invalid op)
#elif TYPE==16
inline GLenum get_type(int which) { return (which==1)? GL_RGB32I: GL_RGB; } //doesn't work (invalid op)
#elif TYPE==17
inline GLenum get_type(int which) { return (which==1)?GL_RGBA32UI:GL_RGBA; } //doesn't work (invalid op)
#elif TYPE==18
inline GLenum get_type(int which) { return (which==1)? GL_RGBA32I:GL_RGBA; } //doesn't work (invalid op)
#elif TYPE==19 //############ 32-BIT FLOAT ############
inline GLenum get_type(int which) { return (which==1)? GL_RGB32F: GL_RGB; } //works
#elif TYPE==20
inline GLenum get_type(int which) { return (which==1)? GL_RGBA32F:GL_RGBA; } //works
#endif
GLuint texture;
void create_texture(void) {
printf(" Status before texture setup: "); error_check();
glGenTextures(1,&texture);
glBindTexture(GL_TEXTURE_2D,texture);
printf(" Status after texture created: "); error_check();
GLenum data_type = GL_UNSIGNED_BYTE;
int data_length = TEXTURE_SIZE*TEXTURE_SIZE*4; //maximum number of channels, so it will work for everything
unsigned char* data = new unsigned char[data_length];
for (int i=0;i<data_length;++i) {
data[i] = (unsigned char)(0);
};
glTexImage2D(GL_TEXTURE_2D,0,get_type(1), TEXTURE_SIZE,TEXTURE_SIZE, 0,get_type(2),data_type,data);
printf(" Status after glTexImage2D: "); error_check();
delete [] data;
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
printf(" Status after texture filters defined: "); error_check();
}
void keyboard(unsigned char key, int x, int y) {
switch (key) {
case 27: //esc
exit(0);
break;
}
}
void draw(void) {
glClearColor(1.0,0.0,0.0,1.0); //in case the quad doesn't draw
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glViewport(0,0,screen_size[0],screen_size[1]);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,screen_size[0],0,screen_size[1]);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex2f(0,0);
glTexCoord2f(2,0); glVertex2f(screen_size[0],0);
glTexCoord2f(2,2); glVertex2f(screen_size[0],screen_size[1]);
glTexCoord2f(0,2); glVertex2f(0,screen_size[1]);
glEnd();
glutSwapBuffers();
}
int main(int argc, char* argv[]) {
glutInit(&argc,argv);
glutInitWindowSize(screen_size[0],screen_size[1]);
glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("Texture Types - Ian Mallett");
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
printf("Status after OpenGL setup: "); error_check();
create_texture();
printf("Status after texture setup: "); error_check();
glutDisplayFunc(draw);
glutIdleFunc(draw);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
最佳答案
When checking for errors, I get [EDIT:] 1282 ("invalid operation"). I take this to mean that the OpenGL is still using OpenGL 2 for glTexImage2D, and so the call is failing.
GL_INVALID_ENUM/VALUE
当您传递一个意外的、不受支持的或超出范围的枚举或值时,会抛出。如果您将“17”作为内部格式传递给
glTexImage2D
, 你会得到
GL_INVALID_ENUM
,因为 17 不是内部格式的有效枚举数。如果您将 103,422 作为宽度传递给
glTexImage2D
, 你会得到
GL_INVALID_VALUE
,因为 103,422 几乎肯定大于
GL_MAX_TEXTURE_2D
的大小。
GL_INVALID_OPERATION
总是用于出错的状态组合。要么有一些先前设置的上下文状态与您正在调用的函数不匹配,要么两个或多个参数组合导致了问题。后者就是你这里的情况。
INVALID_ENUM
(因为内部格式不是有效格式)。获取
INVALID_OPERATION
意味着其他事情是错误的。
glTexImage2D(GL_TEXTURE_2D,0,get_type(1), TEXTURE_SIZE,TEXTURE_SIZE, 0,get_type(2),data_type,data);
get_type(2)
调用返回
GL_RGB
或
GL_RGBA
在所有情况下。但是,当使用积分时
image formats ,你
必须使用
pixel transfer format with _INTEGER
at the end .
get_type(2)
需要是这样的:
inline GLenum get_type(int which) { return (which==1)? GL_RGB16UI: GL_RGB_INTEGER; }
关于OpenGL 2 纹理内部格式 GL_RGB8I、GL_RGB32UI 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11278928/
有没有办法使用 Clojure format(基于 java.util.Formatter)或 cl-format(基于 Common Lisp 的format) 以编程方式设置空格填充?如果您事先知
我正在尝试创建一个用户实体以及数据/文件(pdf格式)。上传并保存到数据库很好,但是当我让用户进入 postman 时尝试发送获取请求方法,然后在数据字段中显示一些糟糕的数据,而且我无法在数据库中看到
我必须将值为 {"STX","ETX"} 的普通字符串数组转换为十六进制值,并且我应该根据 http://www.asciitable.com/ 得到 {2,3} . 最佳答案 听起来你想要一个 Ma
我想格式化我的代码,但不确定哪种格式类型最适合我的项目需要。 我发现仅对于 dart 和 flutter 项目(我都有),有不止一个选项可用于格式化编程语言/框架中预先构建的代码。 Dart : da
我已经尝试了多个代码,例如这样 Sub DateFixer() Application.ScreenUpdating = False Application.Calculation =
SolrQuery query = new SolrQuery(); query.setQuery("*:*"); query.add("wt","csv"); server.query(query)
我有一个包含多个字符串的数据库,我从查询中获取了这些记录,并且我在 QString 中收到了这种格式的数据: "Mon, 13 Nov 2017 09:48:45 +0000" 所以,我需要根据文化来
我有一个 Delphi 2007 DBGrid,我想让用户以更新的 Excel 格式 (OOXML) 保存它,但我的标准是用户不需要安装 Excel。有没有人知道任何已经这样做的组件?是的,我已经搜索
我正在我们的普通 html 站点旁边创建一个移动站点。使用 rails 3.1。移动站点在子域 m.site.com 中访问。 我已经定义了移动格式(Mime::Type.register_alias
我正在尝试使用 xmlstarlet 格式化 xml 文件,但我不想创建新的 xml 文件。 我试过了 xmlstarlet fo --inplace --indent-tab --omit-decl
我在 A 列中有一个带有文本的电子表格。 例如 A1=MY TEXT1 A2=MY TEXT2 A3=MY TEXT3 A4=MY TEXT4 A5=MY TEXT5 我想在文本的前后添加撇号 结果是
我想做一些源代码转换(自动导入列表清理),我想保留注释和格式。我听说过一些关于解析器这样做的事情,我认为是 ghc 解析器。 看起来我可以通过从文件中提取内容来使用 hs-src-exts Langu
我在 Excel 中工作,我想根据另一张表中的列表找出一张表中是否有匹配项。 我已将值粘贴到列表中,并希望从另一张表中返回它们的相应值。包含字母和数字的单元格可以正常工作(例如:D5765000),但
我有一个 DurationField在我的模型中定义为 day0 = models.DurationField('Duration for Monday', default=datetime.time
我正在为我的应用程序开发 WMI 查询。它需要为给定的 VID/PID 找到分配的虚拟 COM 端口。使用 WMI Code Creator 我发现...... 命名空间:root\CIMV2 类:W
我试图弄清楚如何使用 NSTextList,但除了 this SO question 之外,在网上几乎没有找到有用的信息。和 the comment in this blog . 使用这个我已经能够创
我要查询all_objects表在哪里last_ddl_time='01 jan 2010'但它拒绝日期格式... 任何机构给我查询的确切格式? 最佳答案 正如 AKF 所说,您应该使用 Trunc除
我试图在我的应用程序中实现聊天功能。我使用了 2 个 JEditorPane。一个用于保存聊天记录,另一个用于将聊天发送到前一个 JEditorPane。 JEditorPane 是 text/h
我在大学里修了一个编译器类(class),内容非常丰富,很有趣,尽管也很多工作。既然给了我们要实现的语言规范,所以我学不到的一件事就是语言设计。我现在正在考虑创建一种有趣的简单玩具语言,以便我可以玩耍
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
我是一名优秀的程序员,十分优秀!