我在GLSL中制作每像素照明着色器.图为一个立方体网格,根据它们绘制的顺序,应该被遮盖的边在其他边上呈现.当我切换到我的固定功能opengl照明设置时,这不是问题.是什么导致它,我该如何解决?
顶点着色器:
varying vec4 ecPos;
varying vec3 normal;
void main()
{
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
/* first transform the normal into eye space and normalize the result */
normal = normalize(gl_NormalMatrix * gl_Normal);
/* compute the vertex position in camera space. */
ecPos = gl_ModelViewMatrix * gl_Vertex;
gl_Position = ftransform();
}
Run Code Online (Sandbox Code Playgroud)
片段着色器:
varying vec4 ecPos;
varying vec3 normal;
uniform sampler2D tex;
uniform vec2 resolution;
void main()
{
vec3 n,halfV,lightDir;
float NdotL,NdotHV;
vec4 color = gl_LightModel.ambient;
vec4 texC = …Run Code Online (Sandbox Code Playgroud) 最近,我开始使用C++处理OpenGL.
我对通过声明Vertex或更改当前颜色的方式感到恼火
在glColor3f()和glVertex{2,3,4}{sdif}()方法.
那么,为什么OpenGL不会重载这些功能.
例如,输入更好glColor(),glVertex()并且它们将被参数数量及其类型识别.
最终,代码看起来会更好,更容易阅读,结果相同.
我希望有一个很好的理由不要重载类似的功能.
我想知道总是使用glPushAttrib(GL_ALL_ATTRIB_BITS)是否可以?
或者,由于某些性能问题,仅推送必要的位是否更好?
我不太确定这个问题出现了什么,我从来没有太多关于着色器的经验所以它可能与实际的着色器无关(很可能问题不在着色器中)
我有这个结果

片段着色器
#version 120
void main(void) {
gl_FragColor[0] = 0.0;
gl_FragColor[1] = 0.0;
gl_FragColor[2] = 0.0;
}
Run Code Online (Sandbox Code Playgroud)
顶点着色器
#version 120
attribute vec2 coord2d;
void main(void) {
gl_Position = vec4(coord2d, 0.0, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
我的渲染功能
(define (renderFunc)
(gl:Clear gl:COLOR_BUFFER_BIT)
(gl:UseProgram program)
(gl:EnableVertexAttribArray attribute_coord2d)
(gl:Begin gl:TRIANGLES)
(gl:Vertex3f 0.0 0.8 0)
(gl:Vertex3f -0.8 -0.8 0)
(gl:Vertex3f 0.8 -0.8 0)
(gl:End)
(gl:DisableVertexAttribArray attribute_coord2d)
(glut:SwapBuffers))
Run Code Online (Sandbox Code Playgroud)
和我的Init功能
(define (initFunc)
(gl:ClearColor 1 1 1 1)
(gl:Enable gl:TEXTURE_2D)
(gl:Enable gl:LIGHTING)
(gl:Enable gl:BLEND)
(gl:BlendFunc gl:SRC_ALPHA gl:ONE_MINUS_SRC_ALPHA)
(set! program (CreatePorgram …Run Code Online (Sandbox Code Playgroud) 我想写一个初始化openGL的简单类.我决定创建一个run初始化opengl,glutDisplayFunc,glutMainLoop的方法.我想将draw函数传递给此方法并将其用作参数glutDisplayFunc
void OpenGL::run(void(*drawFunction())) {
this->init();
glutDisplayFunc(drawFunction);
glutMainLoop();
};
Run Code Online (Sandbox Code Playgroud)
但我有一个错误argument of void type *(*)() is incompatible with parameter of type void (*)().
它不工作glutDisplayFunc(&drawFunction);,并glutDisplayFunc(*drawFunction);任.有什么问题?
我试图绘制2个简单的三角形没什么特别的,这是着色器代码:
#version 430 core
layout(location=0) in vec4 vPosition;
void
main()
{
gl_position=vPosition;
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,着色器代码非常小并且没有什么特别之处.当我尝试编译这段代码时,我得到了一个
未定义的变量"gl_position"
我不明白为什么因为我认为所有的gl _...变量都是全局变量.
我能做什么 ?
我正在尝试使用顶点缓冲区对象.
起初,在我遇到这种令人讨厌的情况之前没有任何问题:
glPointSize(2.0f);
glBegin(GL_POINTS);
for (Entity p : points) {
glVertex3f(p.x, p.y, p.z);
}
glEnd();
Run Code Online (Sandbox Code Playgroud)
如何将其转换为Vertex缓冲区对象渲染?
我的意思是,你可以看到,数据(x,y,z)每次都为每个点改变(它是一个循环).
那么我如何实现Vertex缓冲区对象渲染呢?
我有flood fill算法代码.
void floodFill() {
float target[3] = { 1.0, 1.0, 0.0 };
float border[3] = { 1.0, 1.0, 1.0 };
float clearp[3] = { 0.0, 0.0, 0.0 };
std::stack<pixel*> colored;
if (!stack.empty()) // stack contains first pixel
colored.push(stack.top());
while(!colored.empty()) {
pixel *p = colored.top();
drawPixel(p->x, p->y, target);
colored.pop();
//up
float pix[3];
glReadPixels(p->x, p->y + KOEF, 1, 1, GL_RGB, GL_FLOAT, pix);
if (!compare(pix,border) && compare(pix,clearp)) {
pixel *pn = new pixel();
pn->x = p->x;
pn->y = p->y + …Run Code Online (Sandbox Code Playgroud) 我试图制作简单的纹理,但是出现了一个错误:
错误:'my_texture'没有命名类型
这里出现的地方(LoadTexture方法后面):
GLuint my_texture;
my_texture = LoadTexture( "grass.bmp" );
Run Code Online (Sandbox Code Playgroud)
这是我的代码.怎么了?
#include <iostream>
#include <GL/gl.h>
#include <GL/glut.h>
#include <stdio.h> /* printf, scanf, NULL */
#include <stdlib.h> /* malloc, free, rand */
using namespace std;
float _angle = 0.5f;
GLuint LoadTexture( const char * filename )
{
GLuint texture;
int width, height;
unsigned char * data;
FILE * file;
file = fopen( filename, "rb" );
if ( file == NULL ) return 0;
width = 1024;
height = 512; …Run Code Online (Sandbox Code Playgroud) 我一直在使用Xcode中的GLFW 2进行OpenGL项目,一切都运行得很好.我能够创建一个3.2 OpenGL上下文,并渲染一切.
但是,昨天我安装了GLFW3 lib并进行了修改建议.现在我根本无法创建3.2上下文,它总是返回3.0.3上下文.我能做错什么?
我在glfw之前加入了glew标题
这是我的初始化代码:
if(!glfwInit()){
std::cout << "ERROR IN glfwInit()" << std::endl;
return;
}
mWindow = glfwCreateWindow(mWidth, mHeight, "GLFW Renderer", NULL, NULL);;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
if(!mWindow){
std::cout << "ERROR IN glfwOpenWindow" << std::endl;
glfwTerminate();
return;
}
/* Make the window's context current */
glfwMakeContextCurrent(mWindow);
int major, minor, rev;
glfwGetVersion(&major, &minor, &rev);
std::cout << "OpenGL " << major << "." << minor << "." << rev << std::endl;
glewExperimental = GL_TRUE;
if(glewInit() != …Run Code Online (Sandbox Code Playgroud)