带 GLUT 的黑屏?
Black screen with GLUT?
本文关键字:GLUT 更新时间:2023-10-16
我正在尝试基于此代码进行一些体积渲染。
我现在正在做的是我有一些示例 3D 数据(数组 chBuffer 本质上是一个 4*4*4 测试数据数组(,我正在将其转换为 OpenGL 3D 纹理。之后,我尝试使用其他 OpenGL 命令渲染此纹理。但是,当我运行应用程序时,屏幕完全是黑色的,并显示某些内容。我做错了什么具体的事情应该解决这个问题吗?
这是我的代码:
#include <glut.h>
#include <GL/gl.h>
#include <gl/glext.h>
#include <stdio.h>
#include <Windows.h>
GLfloat dOrthoSize = 1.0f;
GLuint mu3DTex;
#define MAP_3DTEXT( TexIndex )
glTexCoord3f(0.0f, 0.0f, ((float)TexIndex+1.0f)/2.0f);
glVertex3f(-dOrthoSize,-dOrthoSize,TexIndex);
glTexCoord3f(1.0f, 0.0f, ((float)TexIndex+1.0f)/2.0f);
glVertex3f(dOrthoSize,-dOrthoSize,TexIndex);
glTexCoord3f(1.0f, 1.0f, ((float)TexIndex+1.0f)/2.0f);
glVertex3f(dOrthoSize,dOrthoSize,TexIndex);
glTexCoord3f(0.0f, 1.0f, ((float)TexIndex+1.0f)/2.0f);
glVertex3f(-dOrthoSize,dOrthoSize,TexIndex);
void main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutCreateWindow("Name");
char* chBuffer = new char[64];
for (int i = 0; i < 64; ++i)
chBuffer[i] = ((i + (i / 8)) % 2) * 128 + 127;
char* chRGBABuffer = new char[256];
glGenTextures(1, (GLuint*)&mu3DTex);
glBindTexture(GL_TEXTURE_3D, mu3DTex);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
for (int nIndx = 0; nIndx < 64; ++nIndx)
{
chRGBABuffer[nIndx * 4] = chBuffer[nIndx];
chRGBABuffer[nIndx * 4 + 1] = chBuffer[nIndx];
chRGBABuffer[nIndx * 4 + 2] = chBuffer[nIndx];
chRGBABuffer[nIndx * 4 + 3] = chBuffer[nIndx];
}
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0,
GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *)chRGBABuffer);
glBindTexture(GL_TEXTURE_3D, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.03f);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glEnable(GL_TEXTURE_3D);
glBindTexture(GL_TEXTURE_3D, mu3DTex);
for (float fIndx = -1.0f; fIndx <= 1.0f; fIndx += 0.003f)
{
glBegin(GL_QUADS);
MAP_3DTEXT(fIndx);
glEnd();
}
system("pause");
}
这是 100% 不是如何使用 GLUT。
您需要:
- 设置
glutDisplayFunc()
回调 - 在结束时呼叫
glFlush()
- 在
main()
中调用glutMainLoop()
,而不是将 GL 命令扔到墙上并希望得到最好的结果
像这样的东西(未经测试(:
#include <glut.h>
#include <GL/gl.h>
GLfloat dOrthoSize = 1.0f;
#define MAP_3DTEXT( TexIndex )
glTexCoord3f(0.0f, 0.0f, ((float)TexIndex+1.0f)/2.0f);
glVertex3f(-dOrthoSize,-dOrthoSize,TexIndex);
glTexCoord3f(1.0f, 0.0f, ((float)TexIndex+1.0f)/2.0f);
glVertex3f(dOrthoSize,-dOrthoSize,TexIndex);
glTexCoord3f(1.0f, 1.0f, ((float)TexIndex+1.0f)/2.0f);
glVertex3f(dOrthoSize,dOrthoSize,TexIndex);
glTexCoord3f(0.0f, 1.0f, ((float)TexIndex+1.0f)/2.0f);
glVertex3f(-dOrthoSize,dOrthoSize,TexIndex);
GLuint mu3DTex;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.03f);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_TEXTURE_3D);
glBindTexture(GL_TEXTURE_3D, mu3DTex);
glBegin(GL_QUADS);
for (float fIndx = -1.0f; fIndx <= 1.0f; fIndx += 0.003f)
{
MAP_3DTEXT(fIndx);
}
glEnd();
glFlush();
}
void main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutCreateWindow("Name");
char* chBuffer = new char[64];
for (int i = 0; i < 64; ++i)
chBuffer[i] = ((i + (i / 8)) % 2) * 128 + 127;
char* chRGBABuffer = new char[256];
glGenTextures(1, (GLuint*)&mu3DTex);
glBindTexture(GL_TEXTURE_3D, mu3DTex);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
for (int nIndx = 0; nIndx < 64; ++nIndx)
{
chRGBABuffer[nIndx * 4] = chBuffer[nIndx];
chRGBABuffer[nIndx * 4 + 1] = chBuffer[nIndx];
chRGBABuffer[nIndx * 4 + 2] = chBuffer[nIndx];
chRGBABuffer[nIndx * 4 + 3] = chBuffer[nIndx];
}
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0,
GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *)chRGBABuffer);
glBindTexture(GL_TEXTURE_3D, 0);
glutDisplayFunc( display );
glutMainLoop();
}
相关文章:
- 使用 GLUT 使用键停止动画?
- GLEW/GLUT:调用init并创建一个窗口后,取消初始化并重新初始化?
- OpenGL Glut显示功能在Mojave上显示黑屏
- GLUT 无法获得米利斯精度的时间
- GLUT 问题:重新声明 c++ 内置类型'wchar_t'时出错
- 在macOS上编译GLEW和GLUT?
- 在 CLion (MacOS) 中使用 OpenGL 和 GLUT 库时出现链接错误
- 带 GLUT 的黑屏?
- 如何将整个C Glut程序编写为可以在另一个程序中调用的函数
- C++ GLUT 使对象在视口外消失
- C++ 编译器抛出 GLUT 错误
- 连接GLUT和QGLViewer的问题
- 使用 GLUT/FreeGLUT 创建核心上下文?
- 如何将 GLUT 库设置为 Clion
- OpenGL / GLUT - 许多未定义的引用
- Glut和Gnuplot窗口不同时出现
- 无法在openGL和GLUT中为我想要的确切对象设置动画
- 我试图运行OpenGL,但Glut屏幕只是呈现一个白色屏幕
- Glut计时器/空闲功能未更新
- 在GLUT中每秒产生2个敌人