Не работает альфа-канал (

Указал режим дисплея RGBA:

Glut.glutInitDisplayMode(Glut.GLUT_RGBA | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);

Далее пишу:

Gl.glLineWidth(10);
Gl.glColor4f(1, 0, 0, 0.1f);
Gl.glBegin(Gl.GL_LINE_STRIP);
Gl.glVertex2d(lineX, 0);
Gl.glVertex2d(lineX, lineY - 0.5);
Gl.glEnd();
Gl.glBegin(Gl.GL_LINE_STRIP);
Gl.glVertex2d(0, lineY);
Gl.glVertex2d(lineX - 0.5, lineY);
Gl.glEnd();
Gl.glLineWidth(1);

В релузьтате все рисуется, но без альфа-канала((
0      2148        11.04.2011        13

0 
12.04.2011 00:00:00
Для использования альфа-канала необходимо включить смешивание. Обычно это делается либо при инициализации OpenGL один раз при первом вызове функции, либо включается и выключается каждый раз когда это необходимо. Еще не плохо включить альфа тест, но это по желанию :) Ниже листинг:
GL.glEnable(GL.GL_ALPHA_TEST);
GL.glEnable(GL.GL_BLEND);
// Рисуешь прозрачные части;
GL.glDisable(GL.GL_BLEND)
0 
12.04.2011 00:00:00
А вот собственно твой код:
Gl.glEnable(Gl.GL_ALPHA_TEST);
Gl.glEnable(Gl.GL_BLEND);
Gl.glLineWidth(10);
Gl.glColor4f(1, 0, 0, 0.1f);
Gl.glBegin(Gl.GL_LINE_STRIP);
Gl.glVertex2d(-1, 0);
Gl.glVertex2d(-1, 1 - 0.5);
Gl.glEnd();
Gl.glBegin(Gl.GL_LINE_STRIP);
Gl.glVertex2d(0, 1);
Gl.glVertex2d(-1 - 0.5, 1);
Gl.glEnd();
Gl.glLineWidth(1);
Gl.glPopMatrix();
Gl.glDisable(Gl.GL_BLEND);
Это результат:

А чтобы совсем красивое изображение было нужно еще включить сглаживание того, что будем рисовать (в нашем случае это линии):
// Улучшим края линий;
Gl.glHint(Gl.GL_LINE_SMOOTH_HINT, Gl.GL_NICEST);
// Разрешим сглаживание линий;
Gl.glEnable(Gl.GL_LINE_SMOOTH);
Gl.glEnable(Gl.GL_ALPHA_TEST);
Gl.glEnable(Gl.GL_BLEND);
Gl.glLineWidth(10);
Gl.glColor4f(1, 0, 0, 0.1f);
Gl.glBegin(Gl.GL_LINE_STRIP);
Gl.glVertex2d(-1, 0);
Gl.glVertex2d(-1, 1 - 0.5);
Gl.glEnd();
Gl.glBegin(Gl.GL_LINE_STRIP);
Gl.glVertex2d(0, 1);
Gl.glVertex2d(-1 - 0.5, 1);
Gl.glEnd();
Gl.glLineWidth(1);
Gl.glPopMatrix();
// Запретим смешивание;
Gl.glDisable(Gl.GL_BLEND);
// Запретим сглаживание;
Gl.glDisable(Gl.GL_LINE_SMOOTH);
Вот, то что получится:
0 
12.04.2011 00:00:00
Вот код всей программы:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Tao.OpenGl;
using Tao.FreeGlut;
using Tao.Platform.Windows;
namespace bl
{
public partial class Form1: Form
{
double ScreenW, ScreenH;
private float devX;
private float devY;
private float[,] GrapValuesArray;
private int elements_count = 0;
private bool not_calculate = true;
private int pointPosition = 0;
float lineX, lineY;
float Mcoord_X = 0, Mcoord_Y = 0;
public Form1()
{
InitializeComponent();
AnT.InitializeContexts();
Glut.glutInit();
Glut.glutInitDisplayMode(Glut.GLUT_RGBA | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);
Gl.glClearColor(1, 1, 1, 1);
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
Gl.glViewport(0, 0, AnT.Width, AnT.Height);
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glLoadIdentity();
Gl.glEnable(Gl.GL_ALPHA_TEST);
Gl.glEnable(Gl.GL_BLEND);
if ((float)AnT.Width <= (float)AnT.Height)
{
ScreenW = 30.0;
ScreenH = 30.0 * (float)AnT.Height / (float)AnT.Width;
Glu.gluOrtho2D(0.0, ScreenW, 0.0, ScreenH);
}
else
{
ScreenW = 30.0 * (float)AnT.Width / (float)AnT.Height;
ScreenH = 30.0;
Glu.gluOrtho2D(0.0, 30.0 * (float)AnT.Width / (float)AnT.Height, 0.0, 30.0);
}
devX = (float)ScreenW / (float)AnT.Width;
devY = (float)ScreenH / (float)AnT.Height;
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glLoadIdentity();
RenderTime.Start();
}
private void Draw()
{
Gl.glClearColor(1, (float)(0.6), 1, 1);
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
renderScene();
PrintText2D(45, 1, "[" + Convert.ToString(lineX + "," + lineY) + "]");
renderLines();
Gl.glFlush();
AnT.Invalidate();
}
private void RenderTime_Tick(object sender, EventArgs e)
{
if (pointPosition == elements_count — 1) pointPosition = 0;
Draw();
pointPosition++;
}

private void MM(object sender, MouseEventArgs e)
{
Mcoord_X = e.X;
Mcoord_Y = e.Y;
lineX = devX * e.X;
lineY = (float)(ScreenH — devY * e.Y);
}
private void PrintText2D(float x, float y, string text)
{
Gl.glColor4f(1, 1, 1, 0.1f);
Gl.glRasterPos2f(x, y);
foreach (char char_for_draw in text)
{
Glut.glutBitmapCharacter(Glut.GLUT_BITMAP_9_BY_15, char_for_draw);
}
}
private void functionCalculation()
{
float x = 0, y = 0;
GrapValuesArray = new float[610, 2];
elements_count = 0;
for (x = 0; x <= 60; x += 0.1f)
{
y = (float)Math.Sin(x) * 3 + 15;
GrapValuesArray[elements_count, 0] = x;
GrapValuesArray[elements_count, 1] = y;
elements_count++;
}
not_calculate = false;
}
public void renderScene()
{
Gl.glColor4d(1, 1, 1,0);
if (not_calculate == true)
{
functionCalculation();
}
else
{
Gl.glLineWidth(1);
Gl.glBegin(Gl.GL_LINE_STRIP);
for (int ax = 0; ax < elements_count; ax += 1)
{
Gl.glVertex2d(GrapValuesArray[ax, 0], GrapValuesArray[ax, 1]);
}
Gl.glEnd();
}
Gl.glPointSize(15);
Gl.glColor4f(255, 0, 0,200);
Gl.glBegin(Gl.GL_POINTS);
Gl.glVertex2d(GrapValuesArray[pointPosition, 0], GrapValuesArray[pointPosition, 1]);
Gl.glEnd();
Gl.glPointSize(1);
}
public void renderLines()
{
Gl.glLineWidth(10);
Gl.glColor4f(1, 0, 0, 0.1f);
Gl.glBegin(Gl.GL_LINE_STRIP);
Gl.glVertex2d(lineX, 0);
Gl.glVertex2d(lineX, lineY — 0.5);
Gl.glEnd();
Gl.glBegin(Gl.GL_LINE_STRIP);
Gl.glVertex2d(0, lineY);
Gl.glVertex2d(lineX — 0.5, lineY);
Gl.glEnd();
Gl.glLineWidth(1);
Gl.glDisable(Gl.GL_BLEND);
}
}
}

Вот скрин:

0 
12.04.2011 00:00:00
Как видиш указал смешивание и альфа-тест в конструкторе формы при инициализации, а всеравно нету прозрачности( Может потому, что у меня Windows 7 стоит?
0 
12.04.2011 00:00:00
причем здесь винда??
0 
12.04.2011 00:00:00
Может потому, что у тебя не указан тип смешивания?
0 
12.04.2011 00:00:00
Может?! Я прошу помощи, а не стёба вообщето))
0 
13.04.2011 00:00:00
Ну во-первых не переживай так, тут большая часть помощи просит :))) сам с вопросами на сайт пришел.
Во-вторых посмотри внимательно в редакторе ХТМЛ, когда ты комментарии пишешь на панели инструментов есть кнопка «КОД». Пожалуйста, куски программного кода вставляй через неё — не читабельно вообще получается.
Ну а насчет твоей задачи:
1. У меня тоже 7 стоит, и как сказал isaer, операционная система значения не имеет. Тем более если пишешь на C#, котрый только через Framework работает.
2. Мне кажется, что если ты поверх розового фона рисуешь полупрозрачные красные линии, то в итоге ты и получишь красные, как у тебя на скриншоте.

А код сейчас посмотрю подробно пока время есть, может что-то смогу подсказать.
0 
13.04.2011 00:00:00
Самое главное я и не сказал :)
Кроме включения/выключения смешивания, необходимо сказать ОпенЖЕЛЮ какой тип смешивания использовать:
Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
Существуют разные типы смешивания даю тебе поиграй с параметрами и сам все поймешь.

Но там кроме этого в коде еще лажа есть, которая не дает работать твоей программе. Через несколько минут выложу исправленный код.
0 
13.04.2011 00:00:00
amid прав на 100%.
Мне нужно научиться читать комментарии :))) Только сейчас увидел, что он написал.
0 
13.04.2011 00:00:00
Исправленный код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Tao.OpenGl;
using Tao.FreeGlut;
using Tao.Platform.Windows;

namespace bl
{
public partial class Form1:Form
{
#region GLOBAL
double ScreenW, ScreenH;
private float devX;
private float devY;
private float[,] GrapValuesArray;
private int elements_count = 0;
private bool not_calculate = true;
private int pointPosition = 0;
float lineX, lineY;
float Mcoord_X = 0, Mcoord_Y = 0;
#endregion GLOBAL

// ++++++++++++++++++++++++
// Правильная инициализация
// ------------------------
public Form1()
{
InitializeComponent();
AnT.InitializeContexts();
Glut.glutInit();
Glut.glutInitDisplayMode(Glut.GLUT_RGBA |
Glut.GLUT_DOUBLE |
Glut.GLUT_DEPTH);
Gl.glClearColor(1, 1, 1, 1);
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
Gl.glViewport(0, 0, AnT.Width, AnT.Height);
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glLoadIdentity();

// +++++++++++++++++++++
// Разрешаем смешивание;
Gl.glEnable(Gl.GL_BLEND);
// Устанавливаем тип смешивания;
Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
// Разрешаем использование теста альфа-канала;
//Gl.glEnable(Gl.GL_ALPHA_TEST);
// Без этой строчки прозрачность тоже будет видна;
// ---------------------

if ((float)AnT.Width <= (float)AnT.Height)
{
ScreenW = 30.0;
ScreenH = 30.0 * (float)AnT.Height / (float)AnT.Width;
Glu.gluOrtho2D(0.0, ScreenW, 0.0, ScreenH);
}
else
{
ScreenW = 30.0 * (float)AnT.Width / (float)AnT.Height;
ScreenH = 30.0;
Glu.gluOrtho2D(0.0,
30.0 * (float)AnT.Width / (float)AnT.Height, 0.0, 30.0);
}

devX = (float)ScreenW / (float)AnT.Width;
devY = (float)ScreenH / (float)AnT.Height;
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glLoadIdentity();
RenderTime.Start();
}

private void Draw()
{
Gl.glClearColor(1, 0.6f, 1, 1);
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
renderScene();
PrintText2D(2, 2,
"[" + Convert.ToString(lineX + "," + lineY) + "]");
renderLines();
Gl.glFlush();
AnT.Invalidate();
}

private void AnT_MouseMove(object sender, MouseEventArgs e)
{
Mcoord_X = e.X;
Mcoord_Y = e.Y;
lineX = devX * e.X;
lineY = (float)(ScreenH - devY * e.Y);
}

private void PrintText2D(float x, float y, string text)
{
Gl.glColor4f(1, 1, 1, 0.3f);
Gl.glRasterPos2f(x, y);
foreach (char char_for_draw in text)
{
Glut.glutBitmapCharacter(Glut.GLUT_BITMAP_9_BY_15,
char_for_draw);
}
}

private void functionCalculation()
{
float x = 0, y = 0;
GrapValuesArray = new float[610, 2];
elements_count = 0;
for (x = 0; x <= 60; x += 0.1f)
{
y = (float)Math.Sin(x) * 3 + 15;
GrapValuesArray[elements_count, 0] = x;
GrapValuesArray[elements_count, 1] = y;
elements_count++;
}
not_calculate = false;
}

// ++++++++++++++++++++++++++
// !!! ОШИБКА !!!
// Комментарий ниже.
// --------------------------
public void renderScene()
{
// Изменил,чтобы видеть синусоиду;
Gl.glColor4d(1, 1, 1, 0.2);
if (not_calculate == true)
{
functionCalculation();
}
else
{
Gl.glLineWidth(1);
Gl.glBegin(Gl.GL_LINE_STRIP);
for (int ax = 0; ax < elements_count; ax += 1)
{
Gl.glVertex2d(GrapValuesArray[ax, 0],
GrapValuesArray[ax, 1]);
}
Gl.glEnd();
}
Gl.glPointSize(15);

// Для glColor4f должно быть от 0 до 1;
// Gl.glColor4f(255, 0, 0, 200);
Gl.glColor4f(1.0f, 0.0f, 0.0f, 0.8f);

Gl.glBegin(Gl.GL_POINTS);
Gl.glVertex2d(GrapValuesArray[pointPosition, 0],
GrapValuesArray[pointPosition, 1]);
Gl.glEnd();
Gl.glPointSize(1);
}

// ++++++++++++++++++++++++++++
// !!! Первая ошибка сдесь !!!
// Ты один раз запрещаешь смешивание и больше
// ни где его не включаешь в своей программе.
// ----------------------------
public void renderLines()
{
Gl.glLineWidth(10);
Gl.glColor4f(1.0f, 0.0f, 0.0f, 0.1f);
Gl.glBegin(Gl.GL_LINE_STRIP);
Gl.glVertex2d(lineX, 0);
Gl.glVertex2d(lineX, lineY-0.5);
Gl.glEnd();
Gl.glBegin(Gl.GL_LINE_STRIP);
Gl.glVertex2d(0, lineY);
Gl.glVertex2d(lineX-0.5, lineY);
Gl.glEnd();
Gl.glLineWidth(1);
//Gl.glDisable(Gl.GL_BLEND);
}

private void RenderTime_Tick(object sender, EventArgs e)
{
if (pointPosition == elements_count - 1)
pointPosition = 0;
Draw();
pointPosition++;
}
}
}
И результат работы:


Такое изображение должно было быть?
0 
13.04.2011 00:00:00
// Для glColor4f должно быть от 0 до 1;
// Gl.glColor4f(255, 0, 0, 200);
Gl.glColor4f(1.0f, 0.0f, 0.0f, 0.8f);
Это я уже начал ставить какие угодно значени в код, в надежде что-нибудь поправить)
На самом деле нужно было всего-навсего указать тип смешивания=)) вставил строку с указанием и все заработало)
Большое спасибо за помощ!!!
0 
13.04.2011 00:00:00
Пожалуйста :)))
^
Регистрация
Регистрируясь, вы принимаете правила сайта. Если вы не получили код подтв. регистрации - не забудьте проверить папку спам.
Логин*
Email*
Пароль*
Подтверждение пароля*
 
Логин*
Код*
 
×
Восстановление пароля
Пожалуйста, заполните поля, после чего вы получите код подтверждения на ваш Email. Если код не пришел в течении нескольких минут - проверьте папку спам.
Логин

или Email
Логин*
Код подтверждения*
Новый пароль*
Подтверждение пароля*
×
Авторизация
  • Используйте вашу учетную запись на Facebook.com для входа на сайт.
  • Используйте вашу учетную запись VKontakte для входа на сайт.
  • Используйте вашу учетную запись Google для входа на сайт.
Авторизуйтесь с помощью соц. сети или с помощью аккаунта на сайте:
×