C++ OpenGL VBOs和指针的问题
我正在启动OpenGL,而不是手动绑定缓冲区,我尝试创建一个函数来为我执行此操作,但我遇到了以下两个错误C++ OpenGL VBOs和指针的问题,c++,pointers,opengl,C++,Pointers,Opengl,我正在启动OpenGL,而不是手动绑定缓冲区,我尝试创建一个函数来为我执行此操作,但我遇到了以下两个错误 error LNK2019: unresolved external symbol "void __cdecl createArrayBuffer(float *,unsigned int *,unsigned int)" (?createArrayBuffer@@YAXPAMPAII@Z) referenced in function "public: bool __thiscall Ex
error LNK2019: unresolved external symbol "void __cdecl createArrayBuffer(float *,unsigned int *,unsigned int)" (?createArrayBuffer@@YAXPAMPAII@Z) referenced in function "public: bool __thiscall Example::init(void)" (?init@Example@@QAE_NXZ)
error LNK2019: unresolved external symbol "void __cdecl bindAndPoint(unsigned int *,int)" (?bindAndPoint@@YAXPAIH@Z) referenced in function "public: void __thiscall Example::render(void)" (?render@Example@@QAEXXZ)
我认为这与指针让我感到困惑有关。这是密码
BufferUtilities.cpp:
#define WIN32_LEAN_AND_MEAN
#define WIN32_EXTRA_LEAN
#include <windows.h>
#include "BufferUtilities.h"
#include <iostream>
#include <gl\GLU.h>
#define BUFFER_OFFSET(i) ((char *)NULL+(i))
bool start()
{
glGenBuffers = (PFNGLGENBUFFERSARBPROC)wglGetProcAddress("glGenBuffers");
glBindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer");
glBufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData");
if (!glGenBuffers || !glBindBuffer || !glBufferData)
{
std::cerr << "Vertex buffer objects are not supported by your graphics card." << std::endl;
return false;
}
return true;
}
inline void createArrayBuffer(GLfloat *array, GLuint *buffer, GLenum usage)
{
glGenBuffers(1, buffer);
glBindBuffer(GL_ARRAY_BUFFER, *buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * (sizeof(array)/sizeof(array[0])), &array[0], usage);
}
inline void bindAndPoint(GLuint *buffer, int size)
{
glBindBuffer(GL_ARRAY_BUFFER, *buffer);
glColorPointer(size, GL_FLOAT, 0, BUFFER_OFFSET(0));
}
从这两个函数中删除内联可以进行编译,但在glDrawArrays的运行时会出现一个新错误(GL_TRIANGLE_STRIP,0,4)。是的
我检查了所有指针是否都为空,而不是。我还检查了init()和start()是否返回true,它们确实返回了true。您误用了
inline
关键字。从函数定义和原型中删除它,代码应该编译。例如:
void createArrayBuffer(GLfloat *array, GLuint *buffer, GLenum usage);
void bindAndPoint(GLuint *buffer, int size);
在BufferUtilities.h
和BufferUtilities.cpp
将函数声明为inline
时,必须将声明和定义放在同一文件中。通常是头文件。通过阅读和链接进一步了解这个概念
至于运行时错误,您传递给函数的一个指针似乎为null。
在使用指针参数时,最好向其添加一些检查。例如:
#include <assert.h>
void createArrayBuffer(GLfloat *array, GLuint *buffer, GLenum usage)
{
assert(array != NULL);
assert(buffer != NULL);
...
}
#包括
void createArrayBuffer(GLfloat*数组、GLuint*缓冲区、GLenum使用)
{
断言(数组!=NULL);
断言(缓冲区!=NULL);
...
}
如果其中一个指针为空,
assert
s将通过停止程序执行并调用调试器来帮助您查明错误。您误用了inline
关键字。从函数定义和原型中删除它,代码应该编译。例如:
void createArrayBuffer(GLfloat *array, GLuint *buffer, GLenum usage);
void bindAndPoint(GLuint *buffer, int size);
在BufferUtilities.h
和BufferUtilities.cpp
将函数声明为inline
时,必须将声明和定义放在同一文件中。通常是头文件。通过阅读和链接进一步了解这个概念
至于运行时错误,您传递给函数的一个指针似乎为null。
在使用指针参数时,最好向其添加一些检查。例如:
#include <assert.h>
void createArrayBuffer(GLfloat *array, GLuint *buffer, GLenum usage)
{
assert(array != NULL);
assert(buffer != NULL);
...
}
#包括
void createArrayBuffer(GLfloat*数组、GLuint*缓冲区、GLenum使用)
{
断言(数组!=NULL);
断言(缓冲区!=NULL);
...
}
如果其中一个指针为空,则通过停止程序执行并调用调试器,
assert
s将帮助您查明错误。我发现至少有3个问题:
start
和Engine::init
函数是否返回true
glBufferData(GL_ARRAY_BUFFER,sizeof(GLfloat)*(sizeof(ARRAY)/sizeof(ARRAY[0]),&ARRAY[0],用法)代码>请再说一遍,尺寸是多少typeof(array)==GLfloat*
,=>typeof(array[0])==GLfloat
,=>大小是sizeof(GLfloat*)/sizeof(GLfloat)
,在32位x86操作系统上是1,在64位操作系统上是2,这两种情况下都是不正确的
我发现至少有3个问题:
start
和Engine::init
函数是否返回true
glBufferData(GL_ARRAY_BUFFER,sizeof(GLfloat)*(sizeof(ARRAY)/sizeof(ARRAY[0]),&ARRAY[0],用法)代码>请再说一遍,尺寸是多少typeof(array)==GLfloat*
,=>typeof(array[0])==GLfloat
,=>大小是sizeof(GLfloat*)/sizeof(GLfloat)
,在32位x86操作系统上是1,在64位操作系统上是2,这两种情况下都是不正确的
将
createArrayBuffer
的定义移动到头文件中,或从中删除关键字inline
。使用调试器到达有问题的行。另一件事:永远不要使用通过wglGetProcAddress的函数指针的可用性作为功能支持指示器。OpenGL实现可能会为您提供函数指针,即使某些功能不受支持。例如,当缓冲区对象只是扩展而不是核心功能时,顶点缓冲区对象(VBO)和像素缓冲区对象(PBO)是不同的功能,但重用了gl…Buffer
功能。始终检查GL_扩展字符串是否支持功能。+1到@datenwolf-我记得有些实现返回非空指针,即使在某些肯定不存在的乱七八糟的函数名上(我记得是在android上),也会将createArrayBuffer
的定义移动到头文件,或者从中删除关键字inline
。使用调试器到达有问题的行。另一件事:永远不要使用通过wglGetProcAddress的函数指针的可用性作为功能支持指标。OpenGL实现可能会为您提供函数指针,即使某些功能不受支持。例如,当缓冲区对象只是扩展而不是核心功能时,顶点缓冲区对象(VBO)和像素缓冲区对象(PBO)是不同的功能,但重用了gl…Buffer
功能。始终检查GL_扩展字符串是否支持功能。+1到@datenwolf-我记得有些实现返回非空指针,即使是在一些肯定不存在的乱七八糟的函数名上(我记得是在android上),例如通过将大小(或至少元素计数)作为单独的函数参数传递。我使用vectorE.g修复了它。通过将大小(或至少元素计数)作为单独的函数参数传递。我使用向量修复了它
#include <assert.h>
void createArrayBuffer(GLfloat *array, GLuint *buffer, GLenum usage)
{
assert(array != NULL);
assert(buffer != NULL);
...
}