- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我创建了一个类来从高度图文件加载地形点;但绘制它们会导致崩溃。我已将错误缩小到返回 1281 的 glVertexPointer() 函数(我被引导相信是无效值)。我已经完成了 65k 左右的点数,但似乎找不到问题。在渲染循环中在此之前发生的唯一其他事情是设置 GL_PROJECTION 和 GL_MODELVIEW 以及 glClear()(显然是此绘制调用之后的交换缓冲区)。
class Terrain : public Model
{
public:
Terrain(char* pFile){
if(!LoadTerrain(pFile))
{
OutputDebugString("Loading terain failed.\n");
}
};
~Terrain(){};
void Draw()
{
glPushMatrix();
//glEnableClientState(GL_VERTEX_ARRAY); // Depreciated? Causes crash
glBindBuffer(GL_ARRAY_BUFFER, mVBO);
glVertexPointer(mNumberPoints, GL_FLOAT, 0, (GLvoid*)((char*)NULL));
GLenum a = glGetError(); // 1281
glPointSize(5.0f);
glDrawArrays(GL_POINTS, 0, mNumberPoints);
glBindBuffer(GL_ARRAY_BUFFER, 0);
//glDisableClientState(GL_VERTEX_ARRAY);
glPopMatrix();
}
private:
GLuint mVBO;
int mWidth;
int mHeight;
int mNumberPoints;
bool LoadTerrain(char* pFile)
{
FILE* filePtr;
int error;
unsigned int count;
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
int imageSize, i, j, k, index;
unsigned char* bitmapImage;
unsigned char height;
error = fopen_s(&filePtr, pFile, "rb");
if(error)
return false;
count = fread(&bfh, sizeof(BITMAPFILEHEADER), 1, filePtr);
if(count != 1)
return false;
count = fread(&bih, sizeof(BITMAPINFOHEADER), 1, filePtr);
if(count != 1)
return false;
mWidth = bih.biWidth;
mHeight = bih.biHeight;
mNumberPoints = mWidth * mHeight;
imageSize = mWidth * mHeight * 3; // 3 values * width * height = total data size
bitmapImage = new unsigned char[imageSize];
fseek(filePtr, bfh.bfOffBits, SEEK_SET);
count = fread(bitmapImage, 1, imageSize, filePtr);
if(count != imageSize)
return false;
error = fclose(filePtr);
if(error)
return false;
float* mapArray = new float[imageSize];
k = 0;
for(j = 0; j < mHeight; j++)
{
for(i = 0; i < mWidth; i++)
{
height = bitmapImage[k];
index = (mHeight * j) + i;
mapArray[k++] = (float)i;
mapArray[k++] = (float)height;
mapArray[k++] = (float)j;
/*OutputDebugString(convertInt(i).c_str());
OutputDebugString(",");
OutputDebugString(convertInt(height).c_str());
OutputDebugString(",");
OutputDebugString(convertInt(j).c_str());
OutputDebugString("\n");*/
}
}
// COPY MAP ARRAY INTO BUFFERS
glGenBuffers(1, &mVBO);
glBindBuffer(GL_ARRAY_BUFFER, mVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * imageSize, mapArray, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
delete [] bitmapImage;
bitmapImage = 0;
return true;
};
string convertInt(int number)
{
if (number == 0)
return "0";
string temp="";
string returnvalue="";
while (number>0)
{
temp+=number%10+48;
number/=10;
}
for (int i=0;i<temp.length();i++)
returnvalue+=temp[temp.length()-i-1];
return returnvalue;
}
};
最佳答案
以下代码片段表明您错误地使用了 glVertexPointer 的第一个参数:
glVertexPointer(mNumberPoints, GL_FLOAT, 0, (GLvoid*)
[...]
glDrawArrays(GL_POINTS, 0, mNumberPoints);
它应该是你的位置 vector 每个顶点的分量数,这里只有 2、3 或 4 是有效的。您似乎使用 3D 位置,因此 3 是正确的值。
关于c++ - OpenGL glVertexPointer 返回 1281 - 不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21270365/
我正在查看 CUDA 的粒子示例,但我找不到它们在顶点数组和着色器中的变量之间建立链接的位置。根据我读过的内容和实际上我一直在做的方式是 ... glGenBuffers(1, &VBO); glBi
调用glVertexPointer()(以及其他相关函数)时使用堆栈上的顶点数组是否安全?我不清楚 OpenGL 何时实际从传入的结构中复制数据。 如果不安全,那么您如何知道何时可以安全地销毁/重用传
我在使用 OpenGL 时遇到了一个相当奇怪的问题。当我尝试使用没有绑定(bind)到 GL_ARRAY_BUFFER 的缓冲区的 glVertexPointer 并使用 Vertex Array O
我正在为 iOS 使用 OPENGL ES,但是这可能适用于任何 OPENGL 场景;我有一个顶点数组,但只想绘制其中的一些。在下面的示例中,我想从第一个点到第二个点画一条线,然后是第 4 个点到第
我正在使用 OpenGL ES 创建一个 Android 应用程序,需要一些关于顶点、纹理和法线指针的帮助。我看到的例子停留在相当基本的水平,所以我似乎错过了一些信息。 我的基本 draw() 过程是
我的顶点交错在 numpy 数组 (dtype = float32) 中,如下所示:... tu, tv, nx, ny, nz, vx, vy, vz, ... 渲染时,我像这样调用 gl*Poin
每当我查看解释如何使用 glDrawArrays 和 glVertexPointer 命令的教程时,它们使用的参数都与我可用的参数不同。 例如:教程使用如下参数调用 glVertexPointer:(
我有以下结构来存储我的顶点数据。 struct Rz3DContourNode { float x; //pos x float y; //pos y float z; //pos
我有一个 Nx4 顶点数组,我想使用 glVertexArray 和 glDrawArray 绘制它们。作为二维散点图。我目前像这样初始化数组: GLint data[4][MAX_N_POINT];
我正在绘制一个交错缓冲区——它是一个通用的顶点属性缓冲区。布局由三个 float 作为顶点坐标,以及另外两个 float 属性组成,交错如下: | float | float | floa
我需要将我的程序从 glVertex 重新编写为 glDrawArrays,并且我正在尝试使用此函数进行整理。您能解释一下为什么这段代码不起作用以及如何更改它,以便它绘制 2 个三角形吗? impor
我在 Android 上使用 OpenGL ES 绘制一些形状,所以我有一些模型类可以从 .obj 文件加载顶点等。 然后每个模型都有一个 onDrawFrame() 方法,由渲染器调用以将其放置在场
首次使用程序渲染顶点缓冲区时遇到问题,然后在没有程序的情况下渲染不同的顶点缓冲区。 对于第一个缓冲区,当启用程序时,我使用类似于以下的代码: glBindBuffer( GL_ARRAY_BUFFER
在终端中使用 ndk-build 编译以下 C 代码时(我正在运行 Ubuntu): #include #include #include #include "org_opengldrawinj
我的渲染器过去使用 glBegin/glEnd 用旧的固定函数渲染几何体。通过 glVertexPointer 等将其切换为使用顶点数组后。等,我的 Cg 着色器停止显示。如果我只是做一个常规的纹理绑
我有一个表示顶点的类,如下所示: class Vertex { public: Vertex(void); ~Vertex(void); GLfloat x; GLfloat y; GLfloat z
我创建了一个类来从高度图文件加载地形点;但绘制它们会导致崩溃。我已将错误缩小到返回 1281 的 glVertexPointer() 函数(我被引导相信是无效值)。我已经完成了 65k 左右的点数,但
我在使用 OpenGL 2.0 管道 的家庭作业中遇到问题。问题是当我尝试设置 glVertexPointer 时出现 GL_INVALID_OPERATION(错误 1282)。 我在网上找不到太多
您好,我在使用 VBO 绘图时遇到问题。所以我问了一个问题here .我找不到问题的答案。但是通过讨论那里给出的一个答案,我现在有了另一个关于 VBO 进步的问题。我对它是什么和做什么感到困惑。 在h
我使用结构 struct Vertex { float pos[3]; float tex[2] = {0, 0}; float norm[3] = {0, 0, 0}; int i
我是一名优秀的程序员,十分优秀!