我尝试使用glVertexPointer,glColorPointer和glDrawArrays渲染简单三角形,但它仍然不起作用.还有glBegin的版本,它可以工作,所以顶点没有错误.
void GlWindow::paintGL() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslated(0,-0.5,-1.0);
GLfloat object[] = {
-length/5, 0.0, 0.0,
length/5, 0.0, 0.0,
0.0, 1.0, 0.0
};
GLfloat colors[] = {
0.0, 1.0, 0.0,
0.0, 1.0, 0.0,
0.0, 1.0, 0.0
};
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, object);
glColorPointer(3, GL_FLOAT, 0, colors);
glDrawArrays(GL_TRIANGLES, 0, 1);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
/*
glColor3f(0.0, 1.0, 0.0);
glBegin(GL_TRIANGLES);
glVertex3f(-length/5, 0.0, 0.0);
glVertex3f(length/5, 0.0, 0.0);
glVertex3f(0.0, 1.0, 0.0);
glEnd();
*/
glFlush();
}
Run Code Online (Sandbox Code Playgroud) 我有编译程序的问题,我找不到任何错误.有问题的代码和错误消息如下所示:
我的错误消息:
- 错误2错误C4430:缺少类型说明符 - 假定为int.注意:C++不支持默认int C:\用户\ codasm \桌面\诺威projekty\glfwframework1\system.h中9 1 GLFWFramework1
- 错误1错误C2143:语法错误:缺少';' 在' 'c:\ users\codasm\desktop \nowe projekty\glfwframework1\system.h之前9 1 GLFWFramework1*
将我链接到System.h第9行的错误消息,我不明白什么是错的:
Shader* shader;
Run Code Online (Sandbox Code Playgroud)
system.h中:
#ifndef System_h
#define System_h
#include "Core.h"
class System
{
GLFWwindow* window;
Shader* shader;
// GLuint shader;
GLenum error;
GLuint VAO, VBO, TBO;
vector<vec3> vertices;
vector<vec2> uvs;
vector<vec3> normals;
public:
System();
~System();
bool InitWindow();
bool InitExtensions();
bool InitShaders();
bool InitVertices();
bool InitTextures();
bool InitModels();
void Resize(GLFWwindow* window);
void BeginScene();
void EndScene(GLFWwindow* window);
void Display(GLFWwindow*);
void Run();
void …Run Code Online (Sandbox Code Playgroud) 哪个命令将ram像素缓冲区准确上传到视频内存中的纹理?
这是glTexImage2D(...)?也许或其他什么?
如果我有一些纹理,并想要更改RAM缓冲区内容我可以用什么命令将其转移到视频卡?
我可以用于此目的?
我用OpenGL它在屏幕上绘制一些内容.
这是初始化:
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, height, 0, 10, -10);
glMatrixMode(GL_MODELVIEW);
Run Code Online (Sandbox Code Playgroud)
然后我使用这个绘制对象:
void draw(...)
{
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBegin(GL_QUADS); //Begining the cube's drawing
{
glTexCoord3f(tu1, tv1, 1); glVertex3f(offset, _y, _z);
glTexCoord3f(tu2, tv1, 1); glVertex3f(offset + w, _y, _z);
glTexCoord3f(tu2, tv2, 1); glVertex3f(offset + w, _y + h, _z);
glTexCoord3f(tu1, tv2, 1); glVertex3f(offset, _y + h, _z);
}
glEnd();
glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
}
Run Code Online (Sandbox Code Playgroud)
但深度不受尊重(用很多_z值测试).它随着呼叫的顺序而变化,越近将是最后绘制的.
如果我先画出粉红色条:

如果我在奶油条后绘制粉红色条:

我正在尝试在我的程序中使用着色器,但我得到了非常奇怪的错误...
Vertex shader failed to compile with the following error
ERROR: 0:6: error(#132) Syntax error: "in" parse error
ERROR: error(#273) 1 compilation errors. No code generated
Run Code Online (Sandbox Code Playgroud)
我认为问题在于文件读取,但在尝试了很多方法后,它仍然无法正常工作.
所以这是我的代码:
bool ShaderProgram::LoadShaderFile(const char* shader_path, GLuint& shader_id)
{
ifstream oFileStream(shader_path);
if(oFileStream)
{
// Load shader code
string sShaderSource;
sShaderSource.assign((istreambuf_iterator<char> (oFileStream) ), istreambuf_iterator<char> () );
// Forward shader code to OGL
const GLchar* chShaderSource = sShaderSource.c_str() + '\0';
printf("%s", chShaderSource);
glShaderSource(shader_id, 1, (const GLchar**) &chShaderSource, NULL);
return true;
}
else
return false;
}
Run Code Online (Sandbox Code Playgroud)
我的着色器: …
我正在使用Lazy Foo的教程.我发现glPushMatrix()和glPopMatrix()函数非常混乱.我需要有人来解释如何存储矩阵,如何激活其中一个(如果这就是你所说的)以及来自Lazy Foo网站的代码:
void render()
{
//Clear color buffer
glClear( GL_COLOR_BUFFER_BIT );
//Pop default matrix onto current matrix
glMatrixMode( GL_MODELVIEW );
glPopMatrix();
//Save default matrix again
glPushMatrix();
Run Code Online (Sandbox Code Playgroud)
"打开"然后恢复矩阵服务的目的是什么?
我使用gluPerspective主要增加绘制距离,但它似乎不起作用.
这是它在我的代码中显示的方式:
gluPerspective(0, 70/70, 0, 4333);
Run Code Online (Sandbox Code Playgroud)
ratio:窗口Width和Height都是700,它们是常数,如果想知道的话.
fovy:我把0,因为,"他们"说使用45是非常好画,但它停止在屏幕上绘图.
这是完整的代码:
#include <Windows.h>
#include <gl\GL.h>
#include <gl/glut.h>
WNDCLASSEX wclass;
MSG msg;
HWND hwnd;
HDC hdc;
HDC p_hdc;
float t;
int red, green, blue, x, y, z;
void update()
{
RECT rec;
GetClientRect(hwnd, &rec);
InvalidateRect(hwnd, &rec, false);
UpdateWindow(hwnd);
t += 0.5f;
}
void game()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0, 0, 0, 0);
float norm = 1;
float z = 0;
red = 255;
green = 255;
glPushMatrix();
glRotatef(t, 0, 1, 1);
glBegin(GL_TRIANGLES);
glColor3f(255, …Run Code Online (Sandbox Code Playgroud) 对于大学,我们通过JOGL/Java学习使用OpenGL 1.1的3D图形,它仍然是相当简单的东西:
GL_TRIANGLE_STRIP,GL_LINES)在本课程结束后,我想继续3D图形编程,我还有一些尝试,似乎我只能通过构建自己的(简单)引擎来学习它,所以就这样吧.
我们在大学使用OpenGL 1.1,因为它仍然相当简单和基础,但我认为该行业已经是4.3版了?
有人可以说出主要的差异,可能是功能,但对编程方法更感兴趣吗?
我注意到OpenGL 1.1中很多东西都是在CPU端完成的,尽管它已经支持GPU了.
同样是创建漂亮游戏所需的着色器语言,或者为什么它们经常被使用,我发现它们(在我的空闲时间)异常难以理解.
我在OpenGL中有一个地形,我使用GLSL mix()函数组合了两个纹理.这是我正在使用的纹理.

现在我能够组合和混合这两个纹理,但出于某种原因,当我在地形上渲染纹理时,地形变得透明.我先渲染LHS纹理,然后用alpha通道渲染RHS纹理,我不明白为什么它是透明的.
这是一个有趣的事实,在截图中,你可以看到在Nvidia GPU上渲染时的地形结果,当我在interl HD 3k上渲染相同的东西时,我得到了不同的结果.这个结果是它应该如何,在下面的截图中没有任何透明.

这是我的片段着色器代码..
void main()
{
vec4 dryTex = texture( u_dryTex, vs_texCoord *1 );
vec4 grassTex = texture( u_grassTex, vs_texCoord *1 );
vec4 texColor1= mix(dryTex, grassTex , grassTex.a);
out_fragColor = texColor1;
}
Run Code Online (Sandbox Code Playgroud) 我想使用SDL来处理我的事件,但我正在使用OpenGL来处理图形.有没有办法使用SDL的事件处理,即使我实际上没有任何活动的SDL窗口?