我在头文件中创建了一个结构,如下所示:
typedef struct
{
GLfloat lgtR, lgtG, lgtB, lgtA;
GLfloat x, y, z;
bool islight;
GLfloat width, height, depth;
GLenum lightn;
particle prt;
int maxprt;
} emitter;
Run Code Online (Sandbox Code Playgroud)
这没有问题.
但是,在那个特定的头文件中,我想声明一个可以在所有函数中使用的全局发射器,它不是主源文件的一部分:
// header.h global declaration
emmiter currentEmit;
GLvoid glSetEmitter(emitter emitter)
{
currentEmit = emitter;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试这个时,我得到了很多"错误C2228:'.variable'的左边必须有class/struct/union,所以我假设它根本没有声明我的结构.
有没有办法在头文件中全局声明该结构,如果是这样,是否还有一种方法可以防止它成为其他.cpp文件的一部分?
我很好奇你如何指定使用glDrawElements()渲染时使用的着色器.它是使用绑定的最后一个着色器吗?或者你必须使用其他命令.
总结一下:当我使用glDrawElements()时,如何指定使用哪个着色器,即将在我渲染的VBO中的三角形上使用的着色器.
我在那里发现的大部分教程,指南和书籍都与OpenGL有关,解释了如何绘制三角形并初始化OpenGL.没关系.但当他们试图解释它时,他们只列出了一堆函数和参数,如:
glClear()
glClearColor()
glBegin()
glEnd()
...
Run Code Online (Sandbox Code Playgroud)
由于我不擅长通过记忆学习东西,我总是需要回答"为什么我们这样做?" 所以我会编写那么多函数,因为我记得在做其他事情之前我必须先设置一些东西,所以不要因为教程告诉了我.
可以请有人向我解释一下,在开始使用glBegin()和绘制内容之前,我需要为OpenGL定义什么(只有纯OpenGL,我使用SFML作为背景库,但这无关紧要)glEnd().
示例答案:
您必须首先告诉OpenGL清除屏幕所需的颜色.因为在我们开始绘制当前帧之前需要先清除每个帧...
这段代码来自红皮书,例2-15(嗯,代码不完全是书中的代码).照顾我记下的那张纸条.
#include <fstream>
#include <stdlib.h>
#include <GL/glew.h>
#include <GL/glut.h>
#pragma comment(lib,"glew32.lib")
using namespace std;
#define BUFFER_OFFSET(offset) ((GLubyte *)NULL+offset)
#define XStart -0.8
#define XEnd 0.8
#define YStart -0.8
#define YEnd 0.8
#define NumXPoints 11
#define NumYPoints 11
#define NumPoints (NumXPoints * NumYPoints)
#define NumPointsPerStrip (2*NumXPoints)
#define NumStrips (NumYPoints-1)
#define RestartIndex 0xffff
void display(void)
{
int i,start;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1);
glDrawElements(GL_TRIANGLE_STRIP,NumStrips*(NumPointsPerStrip+1),GL_UNSIGNED_SHORT,BUFFER_OFFSET(0));
//glFlush();//it works,show a white square with black backgroud
glutSwapBuffers();///it doesn't work,show what tha area looked like before
}
void init …Run Code Online (Sandbox Code Playgroud) 我想知道是否有任何if语法可用于在mac和windows上运行opengl c ++代码.更具体地说,在代码的开头,我可以设置一个if条件来确定代码是在mac(通常是xcode)还是windows(通常是visual c ++)上运行,并相应地包含头文件.
我正在使用openGL和"freeglut"库进行体积渲染和显示.在主线程中,我初始化openGL窗口,然后逐帧获取体积数据,体积渲染在获取一个体数据后完成.这很好用,但需要很长时间.是否有可能继续在主线程中初始化openGL窗口,并在另一个线程中进行体积渲染和显示?我检查了wglMakeCurrent,它没有更新主线程中初始化的窗口.
我在片段着色器上做了一些工作,允许纹理渲染和颜色渲染.在我做了更改后,我的所有纹理都非常像素化(就像一个旧的8位游戏),我不得不提高纹理坐标的精度到中等.这也给我带来了性能影响.我只是不明白为什么我突然不得不首先改变精度.
这是"原始"着色器:
varying lowp vec2 TexCoordOut;
uniform sampler2D Texture;
uniform lowp float opacity;
void main(void) {
gl_FragColor = opacity * texture2D(Texture, TexCoordOut);
}
Run Code Online (Sandbox Code Playgroud)
这是着色器在更改后的样子:
varying mediump vec2 TexCoordOut;
uniform sampler2D Texture;
uniform lowp vec4 color;
uniform lowp float opacity;
uniform int colorRender;
void main(void) {
if (colorRender == 1)
{
gl_FragColor = color;
} else {
gl_FragColor = opacity * texture2D(Texture, TexCoordOut);
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的代码,只是绘制一个建筑物,我想添加建筑物的阴影.我已经尝试了很多代码示例,但要么它们太复杂了,而且绘制了一些对象.或者太模糊了 我怎样才能看到建筑的阴影?
#include "GLee/GLee.h" //GL header file, including extensions
#include "glut.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include "tga.h"
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
char g_SelectedColor = 'w';
int g_Width;
int g_Height;
int a=0.0 ,b=0.0, c=500, d=0.0, e=0.0, f=0.0,g=0.0,h=1.0,i=0.0;
static int rotationAngle=0;
void init();
void myMouseFunction( int button, int state, int mouseX, int mouseY );
void myKeyboardFunction( unsigned char key, int mouseX, int mouseY );
void Reshape( int width, int height );
void timer( int val );
void display(); …Run Code Online (Sandbox Code Playgroud) 我在Xcode中有一个简单的OpenGL项目.
升级到4.5后,Xcode开始以一种奇怪的方式运行
在以下行中
#include <fstream.h>
Run Code Online (Sandbox Code Playgroud)
编译失败,出现以下错误消息:未找到词法或预处理器问题'fstream.h'文件.
用于在Xcode 4.2中成功编译的相同代码
将线路更改为
#include <c++/4.2.1/backward/fstream.h>
Run Code Online (Sandbox Code Playgroud)
修复了问题,但生成了其他一些编译错误.
我正在使用Slick2D库来向屏幕呈现文本,但为了呈现像Rect这样的gl形状,我需要先禁用GL_TEXTURE_2D.我只是好奇为什么需要它.为什么GL_TEXTURE_2D禁用形状渲染?