我在glew init完成之后和任何其他gl命令调用之前调用glGetError时得到GL_INVALID_ENUM代码.我正在设置OpenGL 4.2 CORE,转发兼容.使用GLFW进行窗口/输入,GLEW用于gl上下文所有这些都在Windows 7上运行64位.我的显卡是GeForce 550GT,它有最新的OpenGL 4.2驱动程序.另一个奇怪的事情是我使用glDrawElements()工作正常.但是我尝试了glDrawArrays(),我需要一些特定的任务,它我没有工作.我重新检查所有的gl语法,缓冲创建着色器等.没有.我在调用glDrawArrays()时得到GL_INVALID_OPERATION,我不知道为什么.所有这项工作都是一个迷你渲染引擎,但目前是管道非常简单所以我无法理解可能是什么问题.这是我如何初始化上下文和窗口:
void Engine::InitWithGLFW(){
if(!glfwInit()){
exit(EXIT_FAILURE);
}
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 4);
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);
glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE);
glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwOpenWindowHint(GLFW_FSAA_SAMPLES,0);
glfwDisable( GLFW_AUTO_POLL_EVENTS );
#ifdef DEBUG
glfwOpenWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);
#endif
if(!glfwOpenWindow(_width,_height,8, 8, 8, 8, 24, 8,GLFW_WINDOW)){
glfwTerminate();
exit(EXIT_FAILURE);
}
glfwSetWindowTitle("XDEngine V-1.0");
InitGlew();
}
void Engine::InitGlew(){
glewExperimental=GL_TRUE;
GLenum err = glewInit();
if (GLEW_OK != err)
{
/* Problem: glewInit failed, something is seriously wrong. */
fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
}
fprintf(stdout, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION));
glEnable(GL_MULTISAMPLE);
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_DEPTH_TEST); …Run Code Online (Sandbox Code Playgroud) 我写C++应用程序应当编译在Windows和GCC上Linux.I都使用MS C++写了一个循环在Windows上通过的std ::列表,它迭代:
auto iter = container.GetObj()->begin();
while (iter!=container.GetObj()->end()){
(*(iter++))->Execute();
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但用GCC编译时"auto"无法识别:
未检测到的令牌"auto" (在NetBeans IDE中)
所以我修复了它"明确定义迭代器:
std::list<Container*>::iterator iter=container.GetObj()->begin();
while (iter!=container.GetObj()->end()){
(*(iter++))->Execute();
}
Run Code Online (Sandbox Code Playgroud)
我的GCC版本是4.7.2
这是否意味着GCC不支持auto关键字?可能我需要升级编译器吗?
我需要根据ASCII表获取键盘键的数值.由于WPF没有内置解决方案,我尝试了几种黑客攻击:
1.这其中只给出大写值.
char res ;
Char.TryParse(e.Key.ToString(),out res);
Debug.WriteLine((int)res);
Run Code Online (Sandbox Code Playgroud)
2即使它在许多地方被列为可能的解决方案,但这个数字完全错误.
Debug.WriteLine(Convert.ToInt16(e.Key).ToString());
Run Code Online (Sandbox Code Playgroud)
那么如何从WPF中的输入中获取大写和小写字母ASCII代码?
更新
在这里得到几个答案后,我想强调一下我的问题.我绝对必须从输入中得到ASCII代码,无论是大写还是大写.没有硬编码字符比较或类似的东西.我正在寻找更通用的方法.
我有一个C++应用程序,它在运行时生成原始位图图像并将它们推送到临时std :: vector中,在每次写入时动态分配内存,然后用于在程序存在之前将这些图像写入文件.目前位图大小为1280x720 .我在帧650 + - 3帧之后得到"错误的分配"错误.我很清楚,原因是RAM内存不够.那是因为如果我缩小尺寸(应该是300x200)我设法存储所有950帧ok.这很奇怪,因为我的机器有16GB的RAM.在任务管理器中我看到RAM显示器仍有很多空闲(深绿色)空间(最多只能使用5GB).它仅使用1/3的空间.我在Windows 7 64bit 16gb RAM Intel I7 CPU上运行.我在VS2012中调试程序.操作系统是否可以将动态分配限制为任意大小?如果是,怎么能我解除了这个限制?
数据类型是字节(无符号字符).是的,正如下面的答案中提到的那样,我编译为32位.
我正在创建一个命名管道文件,如下所示:
void SavePipeFile(){
HANDLE hpipe;
BOOL bRet;
DWORD size;
hpipe =
CreateNamedPipe(
L"\\\\.\\pipe\\mypipe",
PIPE_ACCESS_OUTBOUND,
PIPE_TYPE_BYTE,
1,
0,
0,
0,
NULL
);
if(hpipe == NULL || hpipe==INVALID_HANDLE_VALUE)
{
printf("Error opening handle\n");
}
CloseHandle(hpipe);
}
Run Code Online (Sandbox Code Playgroud)
该函数存在,没有错误.但我在系统中找不到物理文件"mypipe".Windows API是否将其保存到特定位置?在Windows 7 64bit上运行
我有一个目标标准向量:
std::vector<std::pair<float,float> > allVertices;
Run Code Online (Sandbox Code Playgroud)
为什么我要使用对,因为每2个浮点数呈现位置对(x,y).现在,我有一个源std :: vector,它具有所有这些位置但是作为float数组(称为m_vertices).
我需要将所有数据从m_vertices复制到allVertices的末尾,并在复制期间执行数据转换.
std :: transform让我想起了Lambda,但我无法弄清楚如何从float向量复制到float对的向量.
天真的:
std::transform(m_vertices.begin(),m_vertices.end(),allVertices.end(),
[](float x,float y)->std::pair<float,float>
{
return std::pair<float,float>(x * 100.0f,y * 100.0f) ;
}
);
Run Code Online (Sandbox Code Playgroud)
给我编译时错误:
错误C2064:术语不评估为带有1个参数的函数
还有一些比较难看的东西.
顺便说一句,如果有人可以指出如何在std :: pair结构中转换数据对而在我的情况下更有帮助.
更新:
由于一些使用典型迭代器的答案提议,我想强调我真的希望看到功能解决方案.如果有可能的话.
我仍然不完全理解使用源代码配置具有深层嵌套文件夹层次结构的 CMake 项目的正确方法是什么。在这里,为 MSVC 2013 配置
以下是此类项目的示例:
+RootFolder(no code)
+NestedFolder1(no code)
+NestedNestedFolder1(has code .h and .cpp)
+NestedNestedFolder2(has code and nested folder with code)
+NestedNestedNestedFolder1(has code .h and .cpp)
Run Code Online (Sandbox Code Playgroud)
这就是我在 CMake 中配置它的方式:
RootFolder CMakeLists:
project(MyDemoCmakeProject)
add_subdirectory(NestedFolder1)
Run Code Online (Sandbox Code Playgroud)
NestedFolder1 CMakeLists:
add_subdirectory(NestedNestedFolder1)
add_subdirectory(NestedNestedFolder2)
add_definitions(.....)
include_directories(.....)
Run Code Online (Sandbox Code Playgroud)
NestedNestedFolder1 CMakeLists:
set(mysources ${sources})
add_library(MyLib STATIC ${mysources })
Run Code Online (Sandbox Code Playgroud)
NestedNestedFolder2 CMakeLists:
subdirs(NestedNestedNestedFolder1)
set(mysources ${sources})
add_library(MyLib STATIC ${mysources })
Run Code Online (Sandbox Code Playgroud)
NestedNestedNestedFolder1 CMakeLists:
set(mysources ${sources})
add_library(MyLib STATIC ${mysources })
Run Code Online (Sandbox Code Playgroud)
使用此配置运行 CMake 时,我得到:
add_library 无法创建目标“MyLib”,因为另一个同名目标已经存在。现有目标是在源目录 NestedNestedFolder1 中创建的静态库
现在,如果我删除 add_subdirectory(NestedNestedFolder1) add_subdirectory(NestedNestedFolder2)
从 NestedFolder1 CMakeLists.txt 它工作正常。我不完全理解这一刻。例如在 …
我想在JavaScript中使用所谓的"枚举"对象作为字典键(实际上,它也是字典AFAIK).
这不起作用:
var State ={DEFAULT:0,ACTIVE:1 ,INACTIVE:2,ALERT:3};
var statesDict = {
State.ACTIVE : {color:0x00ff00}
State.INACTIVE: {color:0x000000}
};
Run Code Online (Sandbox Code Playgroud)
虽然这个做了:
var State ={DEFAULT:0,ACTIVE:1 ,INACTIVE:2,ALERT:3};
var statesDict = {
1: {color:0x00ff00}
2: {color:0x000000}
};
Run Code Online (Sandbox Code Playgroud)
为什么?是不State.{prop name}应该被它的价值取代?
我有以下情况。UBO 结构在数组中保存 4 个 uint64_t。
struct MaterialData{
uint64_t comps[4];
};
layout (std140, binding = 0) uniform MaterialBlock {
MaterialData data[50];
}material;
Run Code Online (Sandbox Code Playgroud)
问题是,只有索引 = 0 才能给我正确的数据。但是如果我更改为 uint64_t 的 GLSL 内置类型向量,则一切正常:
struct MaterialData{
u64vec4 textures;
};
Run Code Online (Sandbox Code Playgroud)
它肯定与 std140 的填充规则有关。这是OpenGL 4.5 规范的内容:
如果成员是标量或向量数组,则根据规则 (1)、(2) 和 (3),将基本对齐方式和数组步长设置为匹配单个数组元素的基本对齐方式,并向上舍入为vec4 的基本对齐方式。数组末尾可能有填充;数组后面的成员的基偏移量向上舍入到基对齐的下一个倍数。
所以我从这部分了解到
基本对齐方式和数组步长设置为匹配单个数组元素的基本对齐方式
每个数组的成员对齐是成员的大小,即 8 个字节。虽然这并不完全清楚。实际上它不起作用。我可以与 u64vec4 相处,但我想知道如何填充数组uint64_t?
我在 GLSL 中遇到以下错误。这是片段着色器:
#version 450 core
#define DIFFUSE_TEX_UNIT 0
#define INDEX_UNIFORM_LOC 0
layout(binding = DIFFUSE_TEX_UNIT) uniform sampler2D colorTex;
#ifdef SOME_SPECIAL_CASE
layout (location = INDEX_UNIFORM_LOC) uniform uint u_blendMode;
//...more code here related to the case
#endif
//... rest of the code(not important)
Run Code Online (Sandbox Code Playgroud)
现在,当我将此着色器编译为程序而不声明 SOME_SPECIAL_CASE 并且u_blendMode在运行时仍然设置统一时,我从驱动程序收到以下错误:
生成了 GL_INVALID_OPERATION 错误。值无效;预期的 GL_INT 或 GL_UNSIGNED_INT64_NV。
但我希望得到这样的错误:
生成了 GL_INVALID_OPERATION 错误。“位置”无效。
因为如果我不设置SOME_SPECIAL_CASE 预处理器标志,则没有具有此类索引 (0) 的位置。然后我决定检查我有什么制服,这需要GL_INT或GL_UNSIGNED_INT64_NV,所以我根据它的位置(零)查询制服名称:
char buff[20];
GLsizei len = 0;
glGetActiveUniformName(prog.progHandle, 0, 20, &len, buff);
Run Code Online (Sandbox Code Playgroud)
并得到名称'colorTex',这是具有绑定索引的sampler2D制服的名称,DIFFUSE_TEX_UNIT也为零。直到现在,我相信统一位置和绑定点不使用相同的索引,我仍然相信它们不使用,因为否则这个着色器在使用SOME_SPECIAL_CASE …